gpt4 book ai didi

c# - 打开/关闭编译器优化标志的CPU密集型应用程序

转载 作者:行者123 更新时间:2023-12-03 13:21:17 26 4
gpt4 key购买 nike

我编写了一个小程序来比较笔记本电脑的性能。为了使程序CPU更加密集,我用一些多线程代码(通过Parallel API实现)实现了Rabin-Karp模式匹配算法。

我注意到,当在关闭编译器优化标志的情况下执行程序时,所花费的时间要比打开优化标志时所花费的时间多得多。

例如:

  • 花费的时间(优化标记关闭时):40秒(大约)
  • 花费的时间(打开优化标志时):18秒(大约)

  • 我很好奇,因为编译器正在应用哪种优化,从而极大地提高了性能。在打开/关闭此标志的情况下执行代码时,任何有关如何理解发生情况的指针都将非常有帮助。

    代码
    void Main()
    {
    Dictionary<string,bool> collection = new Dictionary<string,bool>();
    IEnumerable<string> commonWords = File.ReadAllLines(@"G:\LINQPad4\words.txt")
    .Where(x => !string.IsNullOrEmpty(x)).Select(t => t.Trim());

    string magna_carta = File.ReadAllText(@"G:\LINQPad4\magna-carta.txt");

    Parallel.ForEach(commonWords,
    () => new Dictionary<string,bool>(),
    (word, loopState, localState) =>
    {
    RabinKarpAlgo rbAlgo = new RabinKarpAlgo(magna_carta,word);
    localState.Add(word,rbAlgo.Match());
    return localState;
    },
    (localState) =>
    {
    lock(collection){
    foreach(var item in localState)
    {
    collection.Add(item.Key, item.Value);
    }
    }
    });

    collection.Dump();
    }

    public class RabinKarpAlgo
    {
    private readonly string inputString;
    private readonly string pattern;
    private ulong siga = 0;
    private ulong sigb = 0;
    private readonly ulong Q = 100007;
    private readonly ulong D = 256;

    public RabinKarpAlgo(string inputString, string pattern)
    {
    this.inputString = inputString;
    this.pattern = pattern;
    }

    public bool Match()
    {
    for (int i = 0; i < pattern.Length; i++)
    {
    siga = (siga * D + (ulong)inputString[i]) % Q;
    sigb = (sigb * D + (ulong)pattern[i]) % Q;
    }

    if(siga == sigb)
    return true;

    ulong pow = 1;
    for (int k = 1; k <= pattern.Length - 1; k++)
    pow = (pow * D) % Q;

    for (int j = 1; j <= inputString.Length - pattern.Length; j++)
    {
    siga = (siga + Q - pow * (ulong)inputString[j - 1] %Q) % Q;
    siga = (siga * D + (ulong)inputString[j + pattern.Length - 1]) % Q;

    if (siga == sigb)
    {
    if (inputString.Substring(j, pattern.Length) == pattern)
    {
    return true;
    }
    }
    }

    return false;
    }
    }

    您可以从以下gitHub存储库下载相关文件: Rabin-Karp Test

    文章: Performance Testing

    最佳答案

    在您的特殊情况下,在并行foreach中有3个for循环,
    我坚信,大多数优化都是通过动态循环转换以及数学部分完成的。

    以下是一些可以通过循环执行的示例:Loop transformation

    C#编译器团队的Eric Lippert对此有一个博客条目:
    what does the optimize switch do

    关于c# - 打开/关闭编译器优化标志的CPU密集型应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10990831/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com