在编写我目前正在编写的程序时,我注意到了性能上的一些变化,并希望检查一些循环中用于解释这一点的计算时间。
我写了一个非常简单的程序,在一个循环中做一个简单的加法计算,并输出它所需的时间,我注意到两个为我在目前无法解释的效果。
第一,守则:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void button1_Click(object sender, RoutedEventArgs e)
{
int a = 1, b = 2, c = 0;
Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 0; i < 100; i++)
{
c += (a + b);
}
sw.Stop();
c = 0;
textBlock1.Text = 100 + ": " + sw.ElapsedTicks;
sw.Restart();
for (int i = 0; i < 1000; i++)
{
c += (a + b);
}
sw.Stop();
c = 0;
textBlock2.Text = 1000 + ": " + sw.ElapsedTicks;
sw.Restart();
for (int i = 0; i < 10000; i++)
{
c += (a + b);
}
sw.Stop();
c = 0;
textBlock3.Text = 10000 + ": " + sw.ElapsedTicks;
sw.Restart();
for (int i = 0; i < 1000000; i++)
{
c += (a + b);
}
sw.Stop();
c = 0;
textBlock4.Text = 1000000 + ": " + sw.ElapsedTicks;
sw.Restart();
for (int i = 0; i < 100000000; i++)
{
c += (a + b);
}
sw.Stop();
textBlock5.Text = 100000000 + ": " + sw.ElapsedTicks;
}
}
现在我可以观察到以下几点:
- 100: 3
- 1000: 15
- 10000: 150
- 1000000: 17000
- 100000000: 840000
有理由解释为什么100圈的时间大约是1000圈的1/5,即使它是计算量的1/10倍,以及为什么100米。循环的长度仅为1米的50倍。即使它是计算量的100倍?有谁知道为什么时间(特别是100循环)在我启动程序后运行一次之后会发生变化,然后保持不变?
发布于 2012-11-08 23:07:18
有理由解释为什么100圈的时间是1000圈的1/5,尽管它是计算量的1/10倍。
你在测量三次滴答,这是一段很小的时间。如果您碰巧遇到了上下文开关,那么您可能会损失更多的时间,即使您的线程马上就被调度了。这基本上是不够长的时间来进行明智的测量,即使是使用Stopwatch
。
有谁知道为什么时间(特别是100循环)在我启动程序后运行一次之后会发生变化,然后保持不变?
我的猜测是,这与JIT编译和/或垃圾收集有关。
这就是为什么基准测试通常首先运行一轮“热身”,并测试合理的工作量,这样测试将花费合理的时间,消除了时间上的一些小问题。
https://stackoverflow.com/questions/13299428
复制相似问题