请问如下的for循环还可以优化吗?花费时间过长50s 1C

public Form1()
{
InitializeComponent();
Stopwatch sw = new Stopwatch();
sw.Start();
//string filePath = @"D:\cp.bin";
string filePath = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + @"cp.txt";//设置路径将文件保存在目标文件下

       using (FileStream fs = File.Create(filePath))//优化
       {

double t0 = 0, f0 = 100000d;
//double beta = (f1 - f0) / t1;
double beta = 900000d/4.194304d;
double chirp = 0;
for(int i=0; i<=167772160; i++)
{
t0 += 0.000000025;
chirp = Math.Cos(Math.PI * (2 * f0 + beta * t0) * t0);
chirp = Math.Round(chirp * 2046);
chirp = chirp*2 + 2046;
byte[] b=Encoding.Unicode.GetBytes(chirp.ToString());
fs.Write(b, 0, b.Length);
}
}
sw.Stop();
MessageBox.Show("耗时为: " + sw.ElapsedMilliseconds.ToString() + " ms");
}


5个回答

写文件应该是个很耗时的操作,把需要转换的数据先保存到内存中,循环完成后,再一次性把所有数据写到文件里;

wonderfuljoy
wonderfuljoy 这个循环次数多,产生的数据量也比较大,用memeryStream 保存的话会报outofmemory 异常。
2 年多之前 回复

http://blog.csdn.net/swjtu_yhz/article/details/72778811 写文件确实需要优化 看下对你有没帮助

For循环次数太多了,而且循环里面只有一个变量t0 需要累加 ,
分成多组分别计算chirp. 实测分16组的话,每组只需4s 出结果。
开16个线程同时分别跑。

图片说明

主要还是For循环里的数学计算这块的优化。
写文件的操作C#内部有优化,copy了一些注释如下(http://referencesource.microsoft.com/#mscorlib/system/io/filestream.cs,e23a38af5d11ddd3),
public override void Write(byte[] array, int offset, int count) {
...
// If our buffer has data in it, copy data from the user's array into
// the buffer, and if we can fit it all there, return. Otherwise, write
// the buffer to disk and copy any remaining data into our buffer.
// The assumption here is memcpy is cheaper than disk (or net) IO.
// (10 milliseconds to disk vs. ~20-30 microseconds for a 4K memcpy)
// So the extra copying will reduce the total number of writes, in
// non-pathological cases (ie, write 1 byte, then write for the buffer
// size repeatedly)

...
}

jiajia3407
jiajia3407 线程18耗时为:7403 ms 线程20耗时为:7748 ms 线程19耗时为:8681 ms 线程16耗时为:11982 ms 线程17耗时为:12178 ms 线程14耗时为:16794 ms 线程15耗时为:16855 ms 线程13耗时为:22189 ms 线程12耗时为:24302 ms 线程1耗时为:28049 ms 线程2耗时为:30756 ms 线程11耗时为:31204 ms 线程3耗时为:33524 ms 线程9耗时为:34392 ms 线程10耗时为:34902 ms 线程7耗时为:38401 ms 线程8耗时为:38643 ms 线程6耗时为:39493 ms 线程5耗时为:40116 ms 线程4耗时为:40679 ms
2 年多之前 回复
jiajia3407
jiajia3407 我试过多线程,开了20个线程,但是每个线程所花费的时间相差很大是怎么回事呢?
2 年多之前 回复
jiajia3407
jiajia3407 分成多组分别计算chirp是什么意思?具体该如何做呢?
2 年多之前 回复

io操作很耗资源
所以尽量把fs.Write(b, 0, b.Length);这块代码写到外面
另外由于循环次数比较多。乘法除法是运算里最耗资源的,所以建议循环内的乘法可以改为相应的位移操作。

jiajia3407
jiajia3407 double类型是不能用位操作的
2 年多之前 回复

图片说明


public void Thread9()
{
Stopwatch sw = new Stopwatch();
sw.Start();
string filePath1 = System.AppDomain.CurrentDomain.
SetupInformation.ApplicationBase + @"cp9.txt";
double t0 = 1.6577216d, f0 = 100000d;
double beta = 900000d / 4.194304d;
double chirp = 0;
using (FileStream fs1 = File.Open(filePath1, FileMode.OpenOrCreate, FileAccess.Write))
{
for (int i = 66308865; i <= 74597472; i++)
{
chirp = Math.Cos(Math.PI * (2 * f0 + beta * t0) * t0);
t0 += 0.000000025d;
chirp = Math.Round(chirp * 2046);
chirp = chirp * 2 + 2046;
byte[] b = Encoding.Unicode.GetBytes(chirp.ToString());
fs1.Write(b, 0, b.Length);
}
sw.Stop();
Console.WriteLine("线程9耗时为:{0} ms",
sw.ElapsedMilliseconds.ToString());
}
}


每个线程里的代码都是这样的,for循环的次数都相同,但时间完全不同

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐