我目前遇到使用C#Threads获得性能优势的问题。我目前在这里做的是加密表格文件(.csv)中所选列的全部内容。该程序通常用于大型文件,其大小可达到数TB,具有数百万行和多列。
为了获得最佳性能,我计划在每个列的单独线程中创建和运行处理算法。我相信每列所需的大量计算都需要保证一个线程。或者至少在我使用 C ++线程进行类似项目时是如此。
现在,出于某种原因,不会下面的代码片段会产生任何加速。实际上,与单线程顺序处理相比所花费的时间仅在几秒钟内 SLOWER 不同。无论我是同时处理1列,4列还是128列,结果大致相同。
// NOTE:
// m_TableData is of type |--Dictionary<int, List<string>>--|
// Key == Column Number
// Value == Column Contents
List<Thread> Threads = new List<Thread>();
// encrypt data in selected columns
foreach (var KeyPair in m_TableData)
{
Threads.Add(new Thread(new ThreadStart(() =>
{
// Process each row element
// NOTE: ColSize is usually huge (>10,000)
int ColSize = KeyPair.Value.Count();
for (int i = 0; i < ColSize; ++i)
{
m_TableData[KeyPair.Key][i] = ProcessingAlgorithm(m_TableData[KeyPair.Key][i]);
}
})));
Threads.Last().Start();
}
foreach (Thread th in Threads)
th.Join();
为了试图阻止虚假共享和/或更好的缓存性能,我甚至尝试将行拆分为500,1000,10000等批次,但无济于事。我甚至尝试过 System.Threading.Tasks.Parallel.ForEach 函数,它似乎也给出了相同的结果。缺乏性能提升让我感到很难过。
这里有专业/经验丰富的并行处理程序员吗?我非常感谢我的代码和问题的任何反馈和批评。谢谢!
答案 0 :(得分:0)
非常确定这不是您最大的性能问题 - 此处还有其他事情(确实需要查看您的ProcessingAlgorithm正在做什么) - 但您可以通过替换来消除循环中的2个字典查找:
m_TableData[KeyPair.Key]
与
KeyPair.Value
所以你最终得到:
for (int i = 0; i < ColSize; ++i)
{
KeyPair.Value[i] = ProcessingAlgorithm(KeyPair.Value[i]);
}
(我可能实际上将列表分配给局部变量而不是使用KeyPair)