Tag: 基准测试

测量定时器的精度(例如秒表/ QueryPerformanceCounter)

鉴于C#中的Stopwatch类可以使用类似下面三个不同计时器的东西 系统定时器,例如精度约为+-10 ms具体取决于可通过timeBeginPeriod设置的定时器分辨率,约为+-1 ms 。 时间戳计数器(TSC)例如,滴答频率为2.5MHz或1滴= 400 ns因此理想情况下是精确度。 高精度事件定时器(HPET),例如,滴答频率为25MHz或1滴= 40 ns因此理想情况下是精确度。 我们如何衡量这种可观察的精度? 精度被定义为 精度是指两次或多次测量彼此的接近程度。 现在,如果Stopwatch使用HPET,这是否意味着我们可以使用Stopwatch来测量与定时器频率相当的精度? 我不这么认为,因为这要求我们能够使用零差异或完全固定开销的计时器,据我所知,对于Stopwatch来说并非如此。 例如,使用HPET并调用时: var before_ticks = Stopwatch.GetTimestamp(); var after_ticks = Stopwatch.GetTimestamp(); var diff_ticks = after_ticks – before_ticks; 那么diff会说大约100 ticks或4000 ns ,它也会有一些变化。 那么如何通过实验测量Stopwatch的可观测精度呢? 所以它支持下面所有可能的定时器模式。 我的想法是搜索最小数量的刻度!= 0,首先建立Stopwatch的开销,用于系统计时器,这将是0,直到例如10ms ,即10 * 1000 * 10 = 100,000个刻度,因为系统计时器的刻度分辨率为100ns ,但精度远非如此。 对于HPET,它永远不会为0,因为调用Stopwatch.GetTimestamp()的开销高于计时器的频率。 但这并没有说明我们使用计时器测量的精确程度。 我的定义是我们可以可靠地测量的差异有多小。 可以通过测量不同的迭代次数ala来执行搜索: var before = Stopwatch.GetTimestamp(); […]

使用Vector 运行比经典循环慢的SIMD矢量化C#代码

我已经看过一些文章,描述了Vector是如何启用SIMD并使用JIT内在函数实现的,因此编译器在使用时会正确输出AVS / SSE / …指令,允许比经典线性循环更快的代码( 这里的例子)。 我决定尝试重写一个方法,我必须看看我是否设法获得了一些加速,但到目前为止我失败了,矢量化代码的运行速度比原来快3倍,而且我不确定为什么。 以下是两个版本的方法,检查两个Span实例是否具有相同位置的所有项对,它们相对于阈值共享相同的位置。 // Classic implementation public static unsafe bool MatchElementwiseThreshold(this Span x1, Span x2, float threshold) { fixed (float* px1 = &x1.DangerousGetPinnableReference(), px2 = &x2.DangerousGetPinnableReference()) for (int i = 0; i threshold != px2[i] > threshold) return false; return true; } // Vectorized public static unsafe bool MatchElementwiseThresholdSIMD(this Span […]

关于优化传递表达式作为方法参数的建议

我非常喜欢使用lambda表达式而不是字符串来表示属性(例如ORM映射)的相对近期趋势。 强类型>>>>字符串输入。 要清楚,这就是我所说的: builder.Entity() .HasTableName( “webservice_accounts” ) .HasPrimaryKey( _ => _.Id ) .Property( _ => _.Id ).HasColumnName( “id” ) .Property( _ => _.Username ).HasColumnName( “Username” ).HasLength( 255 ) .Property( _ => _.Password ).HasColumnName( “Password” ).HasLength( 255 ) .Property( _ => _.Active ).HasColumnName( “Active” ); 在我最近的一些工作中,我需要根据表达式缓存内容,为此,我需要根据表达式创建一个键。 像这样: static string GetExprKey( Expression<Func> expr ) { string key […]

c ++和c#速度比较

当你需要使用原始CPU功率时,我很担心C#处理繁重计算时的速度。 在计算方面,我一直认为C ++比C#快得多。 所以我做了一些快速测试。 第一个测试计算素数<整数n,第二个测试计算一些pandigital数字。 第二次测试的想法来自于: Pandigital Numbers C#素数计算: using System; using System.Diagnostics; class Program { static int primes(int n) { uint i, j; int countprimes = 0; for (i = 1; i <= n; i++) { bool isprime = true; for (j = 2; j <= Math.Sqrt(i); j++) if ((i % j) == 0) […]

为什么List 。OrderBy LINQ比IComparable + List 更快。在Debug模式下排序?

我感兴趣的是使用LINQ对类进行排序,或者实现IComparable接口和List.Sort是否会更快。 当LINQ代码更快时,我感到非常惊讶。 为了进行测试,我创建了一个非常简单的类,其中包含不太合适的TestSort名称,实现了IComparable。 class TestSort: IComparable { private int age; private string givenName; public int Age { get { return age; } set { age = value; } } public string GivenName { get { return givenName; } set { givenName = value; } } public TestSort(int age, string name) { this.age = age; this.givenName […]

我的代码需要运行多长时间?

我怎样才能知道我的C#代码运行了多长时间?

我测量运行时间的方法有缺陷吗?

对不起,这是一个很长的问题,但我只是在分析这个问题时解释我的思路。 最后的问题。 我已经了解了测量代码运行时间的方法。 它运行多次以获得平均运行时间来计算每次运行的差异,并获得更好地利用缓存的时间。 为了测量某人的运行时间,我在多次修改后想出了这段代码。 最后,我最终得到了这个代码,它产生了我打算捕获的结果,而没有给出误导性的数字: // implementation C static void Test(string testName, Func test, int iterations = 1000000) { Console.WriteLine(testName); Console.WriteLine(“Iterations: {0}”, iterations); var results = Enumerable.Repeat(0, iterations).Select(i => new System.Diagnostics.Stopwatch()).ToList(); var timer = System.Diagnostics.Stopwatch.StartNew(); for (int i = 0; i t.ElapsedMilliseconds), results.Average(t => t.ElapsedMilliseconds), results.Max(t => t.ElapsedMilliseconds), timer.ElapsedMilliseconds); Console.WriteLine(“Ticks: {0,3}/{1,10}/{2,8} ({3,10})”, results.Min(t => […]

基准测试方法调用C#

我正在寻找一种在C#中对方法调用进行基准测试的方法。 我已经编写了一个用于大学分配的数据结构,并且想出了一种优化一点的方法,但是在某种情况下会在所有情况下增加一些开销,同时将O(n)调用转换为O(1)在一些。 现在我想针对测试数据运行两个版本,看看是否值得实现优化。 我知道在Ruby中,您可以将代码封装在Benchmark块中,并让它输出在控制台中执行块所需的时间 – 是否有类似C#的可用内容?

在这种情况下,为什么.NET比C ++更快?

确保您在IDE外部运行。 这是关键。 -edit-我喜欢SLaks评论。 “这些答案中的错误信息量是惊人的。” :d 冷静下来。 几乎所有人都错了。 我做了优化。 事实certificate,我所做的任何优化都不够好。 我使用gettimeofday在GCC中运行代码(我将在下面粘贴代码)并使用g++ -O2 file.cpp并获得比C#略快的结果。 也许MS没有创建在这个特定情况下所需的优化,但在下载和安装mingw后,我进行了测试,发现速度几乎相同。 Justicle似乎是对的。 我可以发誓我在我的电脑上使用时钟并使用它来计算并发现它速度较慢但问题已解决。 在MS编译器中,C ++速度几乎不会慢两倍。 当我的朋友告诉我这件事时我无法相信。 所以我拿了他的代码并把一些定时器放在上面。 而不是Boo,我使用了C#。 我不断在C#中获得更快的结果。 为什么? 无论我使用什么数字,.NET版本几乎都有一半的时间。 C ++版(坏版): #include #include #include #include using namespace std; int fib(int n) { if (n > n; n = 41; if (n < 0) break; __int64 start = __rdtsc(); int res = […]

有没有办法计算执行的IL指令的数量?

我想对C#进程进行基准测试,但我不想将时间用作向量 – 我想计算在特定方法调用中执行的IL指令的数量。 这可能吗? 编辑我不是指方法体的静态分析 – 我指的是执行的实际指令数 – 例如,如果方法体包含一个循环,那么计数会因许多指令而增加循环*迭代循环的次数。