繁体   English   中英

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

[英]real time stock quotes, StreamReader performance optimization

我正在开发一个程序,可以从网站上提取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分钟内完成所有操作吗?

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

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

然后,根本不要使用StreamReader 从流中读取,开销很大。

我用股票报价做了一段时间的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%”

很难看到这是怎么实现的,与HttpWebRequest相比,StreamReader的速度令人目眩。 一些基本的假设:假设您要在900分钟内下载5000行,每行100个字符。 这意味着您需要下载900 x 5000 x 100 = 450 MB。 在6分钟内,这需要450E6 / 6/60 * 8 = 10 Mbps的带宽。

你有什么? 10 Mbps是高速Internet服务的典型值,尽管您需要一台可以维持这种速度的服务器。 要将其降低到2秒,您需要将服务升级到30 Mbps。 你的老板可以解决这个问题。

关于您看到的速度改进:注意缓存。

如果您确实需要快速获取实时数据,则应订阅数据提要,而不是将其从站点上刮下来。

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

4分钟的声音听起来很长,无法读取900个文件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM