Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从套接字中提取数据?_C++_Visual Studio 2010_Sockets_Boost Asio - Fatal编程技术网

C++ 从套接字中提取数据?

C++ 从套接字中提取数据?,c++,visual-studio-2010,sockets,boost-asio,C++,Visual Studio 2010,Sockets,Boost Asio,我目前正在以以下方式从套接字中提取数据 boost::asio::read_until( *socket, buffer, "\n", error ); std::string s( (std::istreambuf_iterator<char>(&buffer)), std::istreambuf_iterator<char>()); boost::asio::读取直到(*套接字,缓冲区,“\n”,错误); s

我目前正在以以下方式从套接字中提取数据

            boost::asio::read_until( *socket, buffer, "\n", error ); 
            std::string s( (std::istreambuf_iterator<char>(&buffer)), std::istreambuf_iterator<char>());
boost::asio::读取直到(*套接字,缓冲区,“\n”,错误);
std::string s((std::istreambuf_迭代器(&buffer)),std::istreambuf_迭代器();

似乎拉机制很慢,我需要更快地拉更多的数据。关于我可以做些什么来提高绩效,有什么建议吗?我是否有办法创建另一个套接字并将一些提取工作委托给该套接字?

我过去曾在交易应用程序上工作过,可以告诉您,我从未见过任何订单路由系统或实时报价系统实现搜索“\n”的协议。FIX当然不支持这一点。这意味着,在您的订单路由或live quotes价格系统中的某个位置,有一个应用程序最有可能接收那些可能正在使用修复协议的报价消息,并将其转换为您现在使用的协议。这很可能至少与系统运行缓慢的原因有关

如果每个字符串代表一个股票报价,那么我会考虑重写正在广播价格更新的系统以批量发送它们,而不是每秒发送超过3到5次的系统——假设系统没有被自动交易程序使用(这将是完全不同的主题,需要一个非常不同的方法)。. 看起来该应用程序也在以ascii文本格式发送引号。我会把它改成二进制格式。FIX支持二进制格式已经有相当一段时间了,它被称为。自定义二进制协议也是可以接受的

根据您对股票报价所做的处理,我会考虑不要将每个报价传递给不同的线程。如果唯一的处理仅涉及使用新报价更新窗口,则尤其如此。我将通过用户界面线程传递整个缓冲区(假设它有多个引号,并且只包含引号)。如果需要进行其他处理,比如将其保存到磁盘或数据库,那么我将有一个单独的线程来处理这种处理

您没有向我们显示太多代码。如果客户端应用程序运行缓慢,则您可以尝试以下一些改进方法:

  • 不要动态创建线程。在应用程序的开头创建一个线程池,并根据需要使用它们。理解过多的线程可能比一个线程更糟糕,所以在决定线程数量时,尝试尝试尝试找到一个令人满意的平衡

  • 与上面一样,尝试只创建一次对象,并在需要时重用它们。这可以通过在向量、堆栈或队列中存储一组对象来实现。仅在以下情况下创建新对象: 装着它们的容器已经用完了。如果您的应用程序经常使用新的操作符在堆上创建对象,则尤其如此

  • 在上面的代码中,正如Panasyuk指出的,缓冲区可以移动到while循环之外。错误对象也可以。在代码中寻找可以只创建一次对象而不是一次又一次创建对象的其他区域

  • 了解何时需要对象的实例。静止的。如果多个线程需要写入对象,则通常需要对象的实例。当只有一个线程或多个线程只需要从中读取时,可以使用静态对象

  • 当从处理套接字处理的线程向用户界面线程传递消息时,请确保使用BeginInvoke而不是Invoke。调用是同步的,将等待被调用的方法完成,然后再继续处理。BeginInvoke是异步的,将立即返回,因此效率更高。如果应用程序正在删除消息,并且正在使用Invoke,那么这可能是原因

  • 由于应用程序使用多个线程,因此可以合理地假设存在一些用于防止多个线程同时执行的锁定对象或语句。查看这些情况,确保锁在本质上是细粒度的——这意味着锁不是为了方便而设置在函数的顶部。将它设置在只需要它的函数的中间。确保代码使用关键部分而不是互斥体,因为MicrosoftLand中的关键部分效率更高。唯一需要使用互斥锁的时间是将DLL附加到两个或多个EXE时,这已经很少再做了


  • 首先,试着从循环中移出缓冲区-它不应该每次都被重新创建和分配。低是一个相对的术语,你期望什么样的性能?所以你已经分析了代码,分析器指出瓶颈是从套接字读取数据?无论如何,最小化内存分配和深度拷贝的数量可能是值得的。