C# 如何计算每秒生成的哈希数?
我有一个从字符串生成哈希的函数:C# 如何计算每秒生成的哈希数?,c#,multithreading,hash,C#,Multithreading,Hash,我有一个从字符串生成哈希的函数: stringgeneratehash(字符串明文) 我用4个线程生成尽可能多的哈希 如何计算每秒生成的哈希数(或兆哈希数)?使用计数器变量计算生成的哈希数,并使用计时器将其相应地除以所有x秒 如果每个线程都有一个计数器,并且计时器只读取所有计数器,那么它可能是性能最好的。这样就没有那么多的锁定。您可以使用来更准确地测量时间流逝。您可以启动秒表,生成哈希,然后停止秒表。然后,您应该有一个哈希计数和生成哈希的总时间,您需要计算每秒的速率。您的问题可以很好地分解为3个
stringgeneratehash(字符串明文)代码>
我用4个线程生成尽可能多的哈希
如何计算每秒生成的哈希数(或兆哈希数)?使用计数器变量计算生成的哈希数,并使用计时器将其相应地除以所有x秒
如果每个线程都有一个计数器,并且计时器只读取所有计数器,那么它可能是性能最好的。这样就没有那么多的锁定。您可以使用来更准确地测量时间流逝。您可以启动秒表,生成哈希,然后停止秒表。然后,您应该有一个哈希计数和生成哈希的总时间,您需要计算每秒的速率。您的问题可以很好地分解为3个独立的任务
跨线程共享单个计数变量
基准测试线程完成时间
每秒计算散列数
跨线程共享单个计数变量
public static class GlobalCounter
{
public static int Value { get; private set; }
public static void Increment()
{
Value = GetNextValue(Value);
}
private static int GetNextValue(int curValue)
{
return Interlocked.Increment(ref curValue);
}
public static void Reset()
{
Value = 0;
}
}
在您分离线程之前,请调用GlobalCounter.Reset
,然后在每个线程中(在每次成功哈希之后)调用GlobalCounter.Increment
——使用Interlocked.X
以线程安全的方式执行值的原子操作,它也比锁定
快得多
基准测试线程完成时间
var sw = Stopwatch.StartNew();
Parallel.ForEach(someCollection, someValue =>
{
// generate hash
GlobalCounter.Increment();
});
sw.Stop();
Parallel.ForEach
将阻塞,直到所有线程完成
每秒计算哈希值
...
sw.Stop();
var hashesPerSecond = GlobalCounter.Value / sw.Elapsed.Seconds;
您是在寻找每个线程的哈希数还是哈希总数。请使用共享计数器变量。为什么是负代表?。除非“父”线程收集每个线程的所有哈希,在这种情况下,它可以在收到后对其进行计数。