代码之家  ›  专栏  ›  技术社区  ›  sean717

实时股票报价,流线型阅读器性能优化

c#
  •  0
  • sean717  · 技术社区  · 15 年前

    我正在做一个程序,从一个网站上提取900多只股票的实时报价。我使用httpwebrequest向站点发送http请求,然后 存储对流的响应并使用以下代码打开流:

    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    Stream stream = response.GetResponseStream ();
    StreamReader reader = new  StreamReader( stream )
    

    收到的html的大小很大(5000多行),因此需要很长时间来解析它并提取价格。900份文件, 解析和提取大约需要6分钟。我的老板对此不满意,他告诉我他希望整个过程在两分钟内完成。

    我已经确定了程序中花费大部分时间完成的部分是解析和提取。我试图优化代码以使其更快,下面是 经过优化后我现在拥有的:

    // skip lines at the top
    for(int i=0;i<1500;++i) 
      reader.ReadLine();
    
    // read the line that contains the price 
    string theLine = reader.ReadLine();  
    
    // ... extract the price from the line
    

    现在处理所有文件大约需要4分钟,与我老板的预期还有很大差距。所以我想知道,我有没有别的办法 能否进一步加快解析和提取速度,并在2分钟内完成所有工作?

    4 回复  |  直到 14 年前
        1
  •  1
  •   Paul Mendoza    15 年前

    我用股票报价做了一段时间的html屏幕抓取,但是我发现雅虎提供了一个非常简单的web服务,比加载网站要好得多。

    http://www.gummy-stuff.org/Yahoo-data.htm

    使用此服务,您可以在一个请求中请求最多100个股票报价,它返回一个csv格式的响应,每个符号一行。可以在请求的查询字符串中设置要返回的列。我建立了一个小程序,每天查询一次股票市场上的每一只股票的价格。这对我来说似乎很有效,而且比访问网站获取数据要快得多。

    例如querystring http://finance.yahoo.com/d/quotes.csv?s=GE&f=nkqwxyr1l9t5p4

    它返回

    “通用电气公司”,32.98,“6月26日”,“21.30-32.98”,“纽约证券交易所”,2.66,“7月25日”,28.55,“7月3日”,“0.21%”

        2
  •  1
  •   Andrey    15 年前
    for(int i=0;i<1500;++i) 
      reader.ReadLine();
    

    这个词不好。readline读取所有行并将其存储在某个地方,但没有人使用它。GC的额外工作。逐字节读取并捕获\d\a。

    那就不要用 StreamReader 完全!从溪流中读到,头顶很胖。

        3
  •  1
  •   Hans Passant    15 年前

    很难看出这是怎么可能的,与httpwebrequest相比,streamreader的速度惊人地快。一些基本假设:假设你正在下载900个文件,5000行,每行100个字符,6分钟。这意味着您需要下载900 x 5000 x 100=450兆字节。在6分钟内,需要450E6/6/60*8=10 Mbps的带宽。

    你有什么?对于高速互联网服务来说,10 Mbps是很典型的,尽管您需要一个能够支持这一点的服务器。要将速度降到2秒,您需要将服务升级到30 Mbps。你老板能解决的。

    关于你看到的速度提升:小心缓存。

        4
  •  0
  •   Tim    14 年前

    如果您真的需要快速获得实时数据,那么您应该订阅数据源,而不是从站点上删除它们。

    或者,是否有一些标记可以搜索以找到所需的字段/数据对。

    4分钟读900个文件听起来真是太长了。