实时股票报价,StreamReader性能优化

时间:2010-04-15 17:16:43

标签: c#

我正在制作一个程序,从网站上提取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 个答案:

答案 0 :(得分:1)

for(int i=0;i<1500;++i) 
  reader.ReadLine();

这个特别不好。 ReadLine读取所有行并将其存储在某处,但没有人使用它。 GC的额外工作。逐字节读取并捕获\ D \ A.

然后根本不要使用StreamReader!它很胖,从流中读取。

答案 1 :(得分:1)

我正在使用股票报价进行HTML屏幕抓取,但我发现Yahoo提供了一个非常简单的Web服务,比加载网站要好得多。

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

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

一个示例查询字符串 http://finance.yahoo.com/d/quotes.csv?s=GE&f=nkqwxyr1l9t5p4

返回

的文字

“GENERAL ELEC CO”,32.98,“Jun 26”,“21.30 - 32.98”,“NYSE”,2.66,“Jul 25”,28.55,“Jul 3”,“ - 0.21%”

答案 2 :(得分:1)

很难看出这是如何实现的,与HttpWebRequest相比,StreamReader的速度非常快。一些基本的假设:假设您下载了900行文件,其中包含5000行,6分钟内每行100个字符。这意味着你需要下载900 x 5000 x 100 = 450兆字节。在6分钟内,这需要450E6 / 6/60 * 8 = 10 Mbps的带宽。

你有什么? 10 Mbps是高速互联网服务的典型代表,尽管您需要一台可以维持此功能的服务器。要将其降低到2秒,您需要将服务升级到30 Mbps。你的老板可以解决这个问题。

关于您所看到的速度提升:注意缓存。

答案 3 :(得分:0)

如果您确实需要快速获得实时数据,那么您应该订阅数据源而不是将其从网站上删除。

或者,没有一些令牌可供您搜索以找到所需的字段/数据对。

在900个文件中读取4分钟听起来非常可笑。