Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何计算每秒生成的哈希数?_C#_Multithreading_Hash - Fatal编程技术网

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;
    

    您是在寻找每个线程的哈希数还是哈希总数。请使用共享计数器变量。为什么是负代表?。除非“父”线程收集每个线程的所有哈希,在这种情况下,它可以在收到后对其进行计数。