【发布时间】:2014-02-06 23:04:35
【问题描述】:
我有 testFile.txt 文件(大约 400 毫克)。它包含时间范围为 1 分钟的 OHLC 股票价格。
它的结构:"股票名称、日期、时间、开盘价、最高价、最低价、收盘价、成交量"->"OTHE,20010102,230100,1.9007,1.9007,1.9007,1.9007,4" (这只是一个例子)。
我的主要问题 - 这段代码很慢。我测量了速度,发现关键部分是 double.Parse 部分。是否可以更改代码以提高性能? 我的c#解析代码:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Globalization;
namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
string sourceDir = "D:\\testFile.txt",
outDir = "D:\\result.txt";
Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.InvariantCulture;
using (StreamReader sr = new StreamReader(sourceDir))
{
int divider = 5;
string line = sr.ReadLine();
StreamWriter sw = new StreamWriter(outDir);
List<string> listLine = new List<string>();
List<double> listOpen = new List<double>();
List<double> listHigh = new List<double>();
List<double> listLow = new List<double>();
List<double> listClose = new List<double>();
List<double> listVolume = new List<double>();
DateTime dateTimeOut = new DateTime();
string formatDate = "yyyyMMddHHmmss";
string newLine = "";
double priceOpen, priceHigh, priceLow, priceClose, volume;
//read first line, but don't write it
line = sr.ReadLine();
while (line != null)
{
listLine = line.Split(',').ToList();
dateTimeOut = DateTime.ParseExact(listLine[1] + listLine[2], formatDate, null);
double.TryParse(listLine[3], out priceOpen);
double.TryParse(listLine[4], out priceHigh);
double.TryParse(listLine[5], out priceLow);
double.TryParse(listLine[6], out priceClose);
double.TryParse(listLine[7], out volume);
listOpen.Add(priceOpen);
listHigh.Add(priceHigh);
listLow.Add(priceLow);
listClose.Add(priceClose);
listVolume.Add(volume);
if (dateTimeOut.Minute % divider == 0)
{
newLine = dateTimeOut + "," + listOpen[0] + "," + listHigh.Max() + "," + listLow.Min() + "," + listClose[4] + "," + listVolume.Max();
sw.WriteLine(newLine);
}
line = sr.ReadLine();
}
sr.Close();
}
}
}
}
更新。问题出在这里:
if (dateTimeOut.Minute % divider == 0)
{
newLine = "";
sw.WriteLine(newLine);
}
【问题讨论】:
-
您是根据数据实时显示或计算的吗?
-
你能定义“非常慢”吗?你是如何测量速度的,在什么条件下?我注意到您忽略了
double.TryParse的返回值,顺便说一下-并且您使用double来表示价格而不是decimal,这比性能更让我担心... -
哦,拥有 one 列表不是更明智,其类型包含单行的开盘/高/低/收盘/成交量值?
-
line.Split(',').ToList()在性能关键代码中对我来说没有意义。string.Split返回一个数组,您已经可以使用该数组按索引访问字段。 -
@user3245303:在调试器下运行,还是不运行?这听起来比我预期的要慢得多,而且我怀疑你的方法是有缺陷的估计。那条采样线是真实的采样线吗? (所以我们可以执行类似的基准测试。)如果您可以提供一个简短但完整的程序用于基准测试,那将非常有帮助。
标签: c#