并行比常规foreach要花费更多的时间

本文关键字:时间 常规 foreach 并行 | 更新日期: 2023-09-27 18:21:06

我想通过添加并行功能来改进我的caesar密码,但对代码的进一步测量表明,并行方法比普通方法需要更多的时间来完成。

为什么?

正常

public string CaesarEncrypt(string text, int positions, char[] charSet = null) {
    if (string.IsNullOrEmpty(charSet)) {
        charSet = ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789").ToCharArray();
    }
    List<char> charList = charSet.ToList();
    StringBuilder sb = new StringBuilder { Capacity = text.Length };
    foreach (char c in text) {
        int charPos = charList.IndexOf(c);
        if ((charPos == -1)) {
            sb.Append(c);
        } else {
            while (!(((charPos + positions) < (charSet.Length)))) {
                charPos -= charSet.Length;
            }
            sb.Append(charSet(charPos + positions));
        }
    }
    return sb.ToString();
}

平行

public string CaesarEncrypt(string text, int positions, char[] charSet = null) {
    if (string.IsNullOrEmpty(charSet)) {
        charSet = ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789").ToCharArray();
    }
    List<char> charList = charSet.ToList();
    StringBuilder sb = new StringBuilder { Capacity = text.Length };
    Parallel.ForEach(text.ToArray(), (char c) =>
    {
        int charPos = charList.IndexOf(c);
        if ((charPos == -1)) {
            sb.Append(c);
        } else {
            while (!(((charPos + positions) < (charSet.Length)))) {
                charPos -= charSet.Length;
            }
            sb.Append(charSet(charPos + positions));
        }
    });
    return sb.ToString();
}

并行比常规foreach要花费更多的时间

多线程的管理有一定的成本。如果循环主体中的任务太小,则此开销可能大于多线程的增益。

这里的另一个问题是,如果在平行体内部附加一个StringBuilder。由于无法保证线程将以何种顺序完成,因此最终可能会得到混乱的结果。