我的节俭定义是这样的:
list<i32> getValues()
用C++实现。
Server.cpp具有以下代码段:
.....
std::vector<int32_t> store;
TransferServiceHandler() {
for(int i=0;i<100000000;i++)
store.push_back(i);
}
void getValues(std::vector<int32_t> & _return) {
// Your implementation goes here
_return = store;
}
.....
Client.cpp有一个简单的循环,在其中调用getValues():
for(int k=0;k<10;k++){
clock_gettime(CLOCK_REALTIME, &ds_spec);
int64_t dstarted = ds_spec.tv_sec * 1000 + (ds_spec.tv_nsec / 1.0e6);
std::vector<int32_t> values;
client.getValues(values);
clock_gettime(CLOCK_REALTIME, &de_spec);
int64_t dended = de_spec.tv_sec * 1000 + (de_spec.tv_nsec / 1.0e6);
std::cout << "Values size :" << values.size() << " in " << (dended - dstarted) << " ms\n";
}
连接被初始化并在循环外部关闭。
通常,此调用返回数十万个条目。
当没有数据时(列表为空),我可以看到 call 发生在1毫秒至2毫秒之间,当我更改数据时,传输中会出现无法预料的延迟。客户端和服务器都在同一台计算机上运行(配备10Gb / s以太网,8个内核和30 GB内存)。
您通常如何调试这种情况?我不认为问题出在网络上,因为它的10 Gigs机器和数据大小几乎只有几MB。
我运行了一个具有各种数据大小的基准,您可以看到每次通话的延迟都不稳定。
最佳答案
我不确定我是否完全了解客户端和服务器之间的交互,但是可以通过使用移动语义(C++ 11)来改进getValue
方法,因此可以移动store
vector 而不是进行复制(内存操作非常昂贵) ) 如下:
void getValues(std::vector<int32_t> & _return) {
// Your implementation goes here
_return = std::move(store);
}
请注意,只要
store
的内容(现在已移至_return)不需要在对getValue
的调用之外继续存在,此方法就可以正常工作。关于c++ - 为什么我的Thread Thrift通话速度很慢?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33604941/