我如何计算每秒生成多少哈希值

本文关键字:多少 哈希值 何计算 计算 | 更新日期: 2023-09-27 17:51:00

我有一个从字符串生成哈希值的函数:
string GenerateHash(string plainText);
我用4个线程生成尽可能多的哈希值。

我如何计算每秒生成多少哈希(或兆哈希)?

我如何计算每秒生成多少哈希值

你的问题可以很好地分为3个独立的任务

  1. 在线程间共享单个计数变量
  2. 基准线程完成时间
  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类来更准确地测量时间的流逝。你可以启动你的秒表,生成你的哈希值,然后停止秒表。然后,您应该有一个散列计数和生成所花费的总时间,您需要计算每秒速率。