我的节俭定义是这样的:

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&#43;&#43; - 为什么我的Thread Thrift通话速度很慢?-LMLPHP

我运行了一个具有各种数据大小的基准,您可以看到每次通话的延迟都不稳定。

最佳答案

我不确定我是否完全了解客户端和服务器之间的交互,但是可以通过使用移动语义(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/

10-12 21:22