有什么区别 - 的性能代价 - 在大块从插座1个字节读取时间与阅读之间的

我有一个C ++应用需要从Web服务器拉出网页和通过线解析所接收的网页线。目前,我一次读取1个字节直到我遇到达到CRLF或1024个字节的最大

如果在大块阅读(一次如1024个字节)是很多更好的性能的角度来看,如何实现相同的行为我现在有(即能够处理1 HTML线同时储存任何想法 - ?直到而不消耗后续字节尚CRLF)

编辑:

我买不起太大的缓冲区。我在一个非常紧凑的代码预算应用在嵌入式设备中使用。我宁愿只保留一个固定大小的缓冲区,preferrably举行一次在一个HTML线。这使我的分析和其他处理容易,因为我随时通过我尝试访问解析缓冲区,我可以假设我在处理一个完整的HTML线。

感谢。

有帮助吗?

解决方案

如果您是直接从插座,而不是从可缓冲的中间较高级别的表示读出,然后在没有任何可能的疑问,它只是更好地读完全1024个字节,把它们放在RAM中的缓冲器,然后从RAM解析数据。

为什么呢?读一插座上是一个系统调用,并且它会导致在每个读出,这是昂贵的上下文切换。了解更多关于它: IBM技术库:加速插座演出

其他提示

我无法对C注释++,但是从其他平台 - 是的,这可以使的的差异;特别是在开关中的代码需要做的量,并且它需要担心流等的异步性质的次数。

但是,真正的测试,当然,个人资料它。为什么不写,通过使用这两种方法的任意文件搅动一个基本的应用程序,并测试它的一些典型的文件...效果通常是令人吃惊的,如果代码IO约束。如果文件很小,大部分的应用程序运行时的花费的处理的数据,一旦它在内存中,你可能不会注意到任何区别。

第一和最简单的:

cin.getline(buffer,1024);

二,平时所有的IO缓冲,所以你不必太担心

第三,CGI过程开始通常成本更然后输入处理(除非它是巨大 文件)......所以,你可能只是没有去想它。

天儿真好,

一个由做一个字节的时间大的性能命中的是,你的上下文是从用户的时间一遍遍进入系统时间。而过。效率不高的。

抓住一个大截,典型地高达的MTU大小,是可测量更有效。

为什么没有内容扫描到一个载体,迭代是寻找出\ n对您输入分成网页输入行?

HTH

欢呼声,

您没有在从插座每次读一个字节,则在从C / C ++ I / O系统中,如果使用的是CGI这将有alreadety从被缓冲了所有的输入一个的atime读一个字节插座。缓冲I / O的全部要点是把数据提供给的方式,方便他们来处理程序员,所以如果你想在一次处理一个字节,请便。

编辑:在反思,它不是从你的问题不清楚,如果要实现CGI或者只是使用它。你可以通过发布代码片段指示你当前如何读取读取单个字节澄清这一点。

如果你正在直接读取插座,那么你应该简单地读出到进入一个缓冲器整个响应,然后对其进行处理。这有许多优点,包括性能和易用性编码。

如果你正在linitted到一个小缓冲器,然后使用经典缓冲算法,如:

getbyte:
   if buffer is empty
      fill buffer
      set buffer pointer to start of buffer
   end
   get byte at buffer pointer
   increment pointer

可以打开与fdopen()函数的套接字文件descritpor。然后,你已经缓冲IO所以可以调用与fgets()或在该描述符类似。

有在操作系统级别没有差别,数据被反正缓冲。你的应用程序,然而,必须执行更多的代码以一次“读取”的字节之一。

scroll top