我的节俭定义是这样的:
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";
}
在循环外初始化和关闭连接。
此调用通常会返回数十万个条目。
当没有数据时(当列表为空时)我可以看到呼叫在1ms-2ms内发生,当我改变数据时,传输的延迟是不可预测的。客户端和服务器都在同一台机器上运行(配备10Gb / s以太网,8核和30 GB内存)。
你通常如何调试这样的情况?我不认为这个问题与网络有关,因为它的10 Gigs机器和数据大小几乎没有MB。
我运行了各种数据大小的基准测试,您可以看到每次调用的延迟都不稳定。
答案 0 :(得分:3)
我不确定我是否完全理解客户端和服务器之间的交互,但是使用移动语义(C ++ 11)可以改进getValue
方法,因此可以移动store
向量而不是制作副本(内存操作非常昂贵)如下:
void getValues(std::vector<int32_t> & _return) {
// Your implementation goes here
_return = std::move(store);
}
请注意,只要store
(现在已移至_return)的内容不需要超出getValue
的调用范围,就可以正常工作。
答案 1 :(得分:0)
在我看来,你在这里失去了解决方案:
clock_gettime(CLOCK_REALTIME, &ds_spec);
int64_t dstarted = ds_spec.tv_sec * 1000 + (ds_spec.tv_nsec / 1.0e6);
这与使用clock_gettime()
开头的原因背道而驰;
Here是关于如何使用clock_gettime()分析代码的链接;希望它能解决你的问题。
我指的是解决方案,因为这可能是意外分析结果的一个很好的原因。
答案 2 :(得分:0)