gpt4 book ai didi

c# - 简单方法调用真的很慢?

转载 作者:太空狗 更新时间:2023-10-29 19:46:06 24 4
gpt4 key购买 nike

编辑:我已经解决了我的问题。原因是测试过程中的错误,一旦我被允许回答我自己的问题,就会详细说明。

我知道通常应该避免这类问题,但我遇到了一个我无法理解的非常奇怪的情况。我一直在尝试实现 PRNG,并且一直在针对 System.Random 测试其性能。我发现我的代码慢了大约 50 倍,但问题不在于算法,而在于调用方法。即使我只是返回一个常量,它仍然会慢很多倍。

所以我写了一个简单的测试程序来比较调用包装 random.NextDouble() 的方法、返回 -1 的方法和直接调用 random.NextDouble()。我在 Ideone 中进行了测试,并且 it gave the expected results ;所有的时间都是相似的,返回一个常数是最快的。时间都在 0.1 秒左右。

但是,对于每种情况,在 Visual Studio 2011 Beta 或 2010 C# Express 中编译的相同代码将分别产生 4 秒、4 秒和 0.1 秒。我肯定是在 Release模式下运行,优化代码复选框被选中,从 Visual Studio 外部启动会给出相同的结果。那么,为什么这种简单的方法调用在 Visual Studio 中比在 Ideone 中慢得多呢?这是我用来进行基准测试的代码:

using System;
using System.Diagnostics;

public class Test{
static Random random = new Random();

public static Double Random() {
return random.NextDouble();
}

public static Double Random2() {
return -1;
}

public static void Main() {
{
Stopwatch s = new Stopwatch();
Double a = 0;
s.Start();
for (Int32 i = 0; i < 5000000; i++)
a += Random();
s.Stop();
Console.WriteLine(s.ElapsedMilliseconds);
}

{
Stopwatch s = new Stopwatch();
Double a = 0;
s.Start();
for (Int32 i = 0; i < 5000000; i++)
a += Random2();
s.Stop();
Console.WriteLine(s.ElapsedMilliseconds);
}

{
Stopwatch s = new Stopwatch();
Double a = 0;
s.Start();
for (Int32 i = 0; i < 5000000; i++)
a += random.NextDouble();
s.Stop();
Console.WriteLine(s.ElapsedMilliseconds);
}
}
}

最佳答案

您不应该测量对 Random() 和 Random2() 的第一次调用。第一次调用函数时,它由 JITTER 处理。相反,调用 Random() 和 Random2() 一次,然后开始测量。 random.NextDouble() 已在安装 .NET 后编译,因此不会遇到同样的问题。

我不相信这会解释所有的差异,但它应该公平竞争。

关于c# - 简单方法调用真的很慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10065786/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com