我如何计算每秒生成多少哈希值
本文关键字:多少 哈希值 何计算 计算 | 更新日期: 2023-09-27 17:51:00
我有一个从字符串生成哈希值的函数:string GenerateHash(string plainText);
我用4个线程生成尽可能多的哈希值。
我如何计算每秒生成多少哈希(或兆哈希)?
你的问题可以很好地分为3个独立的任务
- 在线程间共享单个计数变量
- 基准线程完成时间
- 计算哈希p/sec
跨线程共享单个计数变量
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
以线程安全的方式执行Value
的原子操作,它也比lock
快得多。
基准线程完成时间
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;
使用计数器变量计算生成的哈希数,并在x秒内使用计时器进行相应的除法。
如果每个线程都有一个计数器,并且计时器只读取所有计数器,这可能是最高效的。那么你就没有那么多的锁了您可以使用Stopwatch类来更准确地测量时间的流逝。你可以启动你的秒表,生成你的哈希值,然后停止秒表。然后,您应该有一个散列计数和生成所花费的总时间,您需要计算每秒速率。