如何将所有处理器内核用于 x64 应用程序
How to Use all processor cores for x64 application
我有一个比较两个数组的简单代码:
static void Main(string[] args)
{
String directory = @"C:\path\";
String[] linesA = File.ReadAllLines(Path.Combine(directory, "array1.txt"));
String[] linesB = File.ReadAllLines(Path.Combine(directory, "array2.txt"));
var onlyB = linesA.Where(a => linesB.Any(b => a.ToLower().Contains(b.ToLower())));
File.WriteAllLines(Path.Combine(directory, "Result.txt"), onlyB);
}
有什么方法可以使用处理器的所有内核来比较这两个数组吗?
如果你真的想加快速度(而不是仅仅使用更多内存),你可以做一些事情。
- 不要对两个文件都使用
File.ReadAllLines()
(将整个文件读入内存),而是对外循环中使用的文件使用 File.ReadLines()
。这只会逐行读取该文件并避免潜在的大量内存使用。
- 不要在字符串上多次使用 ToLower(),而是像这样使用
string.IndexOf()
:var onlyB = linesA.Where(a => linesB.Any(b => a.IndexOf(b, StringComparison.OrdinalIgnoreCase) >= 0));
- 使用
.AsParallel()
并行化部分循环。
综合起来:
var linesA = File.ReadLines(Path.Combine(directory, "array1.txt"));
var linesB = File.ReadAllLines(Path.Combine(directory, "array2.txt"));
Stopwatch sw = Stopwatch.StartNew();
var onlyB = linesA.AsParallel().Where(a => linesB.Any(b => a.IndexOf(b, StringComparison.OrdinalIgnoreCase) >= 0));
进行这些更改后,我的测试程序从 ~3.8 秒缩短到 ~0.6 秒,并且使用的内存少了很多。
我有一个比较两个数组的简单代码:
static void Main(string[] args)
{
String directory = @"C:\path\";
String[] linesA = File.ReadAllLines(Path.Combine(directory, "array1.txt"));
String[] linesB = File.ReadAllLines(Path.Combine(directory, "array2.txt"));
var onlyB = linesA.Where(a => linesB.Any(b => a.ToLower().Contains(b.ToLower())));
File.WriteAllLines(Path.Combine(directory, "Result.txt"), onlyB);
}
有什么方法可以使用处理器的所有内核来比较这两个数组吗?
如果你真的想加快速度(而不是仅仅使用更多内存),你可以做一些事情。
- 不要对两个文件都使用
File.ReadAllLines()
(将整个文件读入内存),而是对外循环中使用的文件使用File.ReadLines()
。这只会逐行读取该文件并避免潜在的大量内存使用。 - 不要在字符串上多次使用 ToLower(),而是像这样使用
string.IndexOf()
:var onlyB = linesA.Where(a => linesB.Any(b => a.IndexOf(b, StringComparison.OrdinalIgnoreCase) >= 0));
- 使用
.AsParallel()
并行化部分循环。
综合起来:
var linesA = File.ReadLines(Path.Combine(directory, "array1.txt"));
var linesB = File.ReadAllLines(Path.Combine(directory, "array2.txt"));
Stopwatch sw = Stopwatch.StartNew();
var onlyB = linesA.AsParallel().Where(a => linesB.Any(b => a.IndexOf(b, StringComparison.OrdinalIgnoreCase) >= 0));
进行这些更改后,我的测试程序从 ~3.8 秒缩短到 ~0.6 秒,并且使用的内存少了很多。