首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >循环中的计算时间差

循环中的计算时间差
EN

Stack Overflow用户
提问于 2012-11-08 23:01:27
回答 1查看 191关注 0票数 1

在编写我目前正在编写的程序时,我注意到了性能上的一些变化,并希望检查一些循环中用于解释这一点的计算时间。

我写了一个非常简单的程序,在一个循环中做一个简单的加法计算,并输出它所需的时间,我注意到两个为我在目前无法解释的效果。

第一,守则:

代码语言:javascript
运行
复制
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;
    }
}

现在我可以观察到以下几点:

  1. 第一次启动程序后,点击按钮并计算,100的短循环大约需要两次/三次(6-9次滴答),只要我第二次运行它(2-4次)。在此之后,它将保持在相同的长度(2-4条蜱)。
  2. 循环时间之间有一些奇怪的比例,当我继续单击按钮时,循环时间保持不变,大致如下所示:

代码语言:javascript
运行
复制
- 100: 3
- 1000: 15
- 10000: 150
- 1000000: 17000
- 100000000: 840000

有理由解释为什么100圈的时间大约是1000圈的1/5,即使它是计算量的1/10倍,以及为什么100米。循环的长度仅为1米的50倍。即使它是计算量的100倍?有谁知道为什么时间(特别是100循环)在我启动程序后运行一次之后会发生变化,然后保持不变?

EN

Stack Overflow用户

回答已采纳

发布于 2012-11-08 23:07:18

有理由解释为什么100圈的时间是1000圈的1/5,尽管它是计算量的1/10倍。

你在测量三次滴答,这是一段很小的时间。如果您碰巧遇到了上下文开关,那么您可能会损失更多的时间,即使您的线程马上就被调度了。这基本上是不够长的时间来进行明智的测量,即使是使用Stopwatch

有谁知道为什么时间(特别是100循环)在我启动程序后运行一次之后会发生变化,然后保持不变?

我的猜测是,这与JIT编译和/或垃圾收集有关。

这就是为什么基准测试通常首先运行一轮“热身”,并测试合理的工作量,这样测试将花费合理的时间,消除了时间上的一些小问题。

票数 3
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13299428

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档