【发布时间】:2012-02-13 22:01:19
【问题描述】:
考虑一下这段非常简单的代码:
uses Diagnostics;
const
ITER_COUNT = 100000000;
procedure TForm1.btn2Click(Sender: TObject);
var
val: Double;
i: Integer;
begin
sw := TStopwatch.StartNew;
val := 1;
for i := 0 to ITER_COUNT - 1 do
begin
val := val + i;
val := val - i;
val := val * 10;
val := val / 10;
end;
sw.Stop;
mmo1.Lines.Add(Format('Simple completed in %D ms. Result: %G',
[sw.ElapsedMilliseconds, val]));
end;
这个简单的循环在我的电脑上以 4027 毫秒执行。现在,如果我编写相同的代码,只使用不同的线程:
procedure TForm1.btn3Click(Sender: TObject);
begin
sw := TStopwatch.StartNew;
TThread.CreateAnonymousThread(
procedure
var
val: Double;
i: Integer;
begin
val := 1;
for i := 0 to ITER_COUNT- 1 do
begin
val := val + i;
val := val - i;
val := val * 10;
val := val / 10;
end;
sw.Stop;
TThread.Queue(nil, procedure
begin
mmo1.Lines.Add(Format('Async completed in %D ms. Result: %G',
[sw.ElapsedMilliseconds, val]));
end);
end
).Start;
end;
这个方法在2910毫秒内执行相同但在不同线程中的方法! (在 Delphi XE 中编译,发布配置处于活动状态)无论我有多少次迭代,我注意到线程中的增益约为 25%。为什么会这样?不应该是一样的结果吗?
编辑: 经过进一步调查,我发现这可能是 Windows 7 操作系统的原因。在 Windows 7 机器上,主线程中的简单循环执行速度比异步版本慢约 25%!我什至尝试使用 Windows XP 模式在同一台 Windows 7 PC 上运行相同的项目,然后两个结果相等 - ~3000 毫秒!我完全迷失了……Windows 7 对主线程的处理速度变慢了?
【问题讨论】:
-
无法重现,我的笔记本电脑的执行时间相同(~2600 毫秒)。
-
对我来说也没有什么不同。 1947 和 1949 毫秒在我的机器上,但由于我仍在使用 Delphi 5 作为我的主要开发环境,因此我学到了一些新东西,为此 +1。
-
您在什么操作系统上进行了测试?
-
@Linas Win7 Ultimate SP1 64 位,CPU Core i3 M380(2 个物理核心/4 个逻辑核心)
-
极不可能与操作系统版本有关。操作系统在循环内无关紧要。