OS違いによる速度差

解決


TK  2019-02-14 23:51:53  No: 49672

OSによって処理される速度が異なる問題に悩んでおります。

<検証コード>
※ローカル変数等の定義は割愛しております
----------------------
lfile := 'd:\Time.txt';
AssignFile( logf, lfile );
Rewrite( logf );
for nn := 1 to 5000000 do begin
    Writeln( logf, '123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345' );
end;
CloseFile( logf );
----------------------

<環境>
同一PCに、Win7(x86)、Win10(x86)、Win10(x64)をインストールしています。
検証exeは上記コードをコンパイル済のexeしか使用していません。

<Delphi>
・Delphi 6
※Delphi 10.2でも現象は同じ

<処理時間>
・Win7(x86):14秒
・Win10(x86):78秒
・Win10(x64):54秒

<PC情報>
・CPU:i3 クロック3.4G
・メモリ:8Gbyte(使用可能:3.4Gbyte)

どんな情報でも構いませんので、情報を頂ければと思います。

以上、よろしくお願いいたします。


ウォレス  2019-02-15 01:25:29  No: 49673

このくらい全文載せた方が親切ではないでしょうか。。。。試すのが面倒になるだけです。。。
Delphi10.3 + Win10RS4
CPU Corei7-6700 3.4GHz
x32 24Sくらい
x64 22Sくらい

----コード---
uses
  System.SysUtils, Diagnostics, TimeSpan;
var
  lfile, S: string;
  logf: TextFile;
  nn: integer;
  sw: TStopwatch;
begin
  S := '';
  for nn := 0 to 255 - 1 do
    S := S + '1';
  sw := TStopwatch.Create;
  sw.Start;
  lfile := 'e:\time.txt';
  AssignFile(logf, lfile);
  Rewrite(logf);
  for nn := 1 to 5000000 do
    Writeln(logf, S);
  CloseFile(logf);
  Writeln(sw.ElapsedMilliseconds / 1000:4:2);
  Readln;
end.


igy  2019-02-15 01:48:39  No: 49674

ちなみに、各OSで動作しているウィルス対策ソフトは、何になりますか?


TK  2019-02-15 02:14:53  No: 49675

>ウォレスさん

省略したコードで申し訳ありませんでした。
また検証コードを書いて下さりありがとうございます。

>igyさん

全OSで「Symantec Endpoint Protection v14」を利用しております。


ウォレス  2019-02-15 02:31:13  No: 49676

VCLでも影響はないようですのでVCLで。。。

・デバッグ/リリースで誤差は数%
・SSD/HDDでも10%も変わらない
・FileStream の方が早いようです(当たり前?)

下記でx32/x64 とも11秒弱でした。
私はウイルスバスターコーポレートエディションです。 

uses
  Diagnostics, TimeSpan;

procedure TForm1.Button1Click(Sender: TObject);
var
  S: string;
  sw: TStopwatch;
  i: Integer;
  fs: TFileStream;
  buff: array [0 .. 256] of byte;
begin
  for i := 0 to 254 do
    buff[i] := (i mod 10) + 48;
  buff[255] := 13;
  buff[256] := 10;
  sw := TStopwatch.Create;
  sw.Start;
  fs := TFileStream.Create('c:\temp\time.txt', fmCreate);
  for i := 1 to 5000000 do
    fs.Write(buff, 257);
  fs.Free;
  Memo1.Lines.Add(format('%6.2f', [sw.ElapsedMilliseconds / 1000]));
end;


igy  2019-02-15 02:33:11  No: 49677

> 全OSで「Symantec Endpoint Protection v14」を利用しております。 

リアルタイムプロテクションの設定のON/OFFで、時間は変わりますか?
あとは、(あれば、ですけど)別のWindows 10の環境でも、同様に時間がかかりますか?

また、
> 同一PCに、Win7(x86)、Win10(x86)、Win10(x64)をインストールしています。 
とありますが、仮想環境ですか?それとも、HDD or SSDにインストールしていますか?


TK  2019-02-15 03:08:19  No: 49678

>ウォレスさん

色々調べて下さりありがとうございます。
ウォレスさんの環境でもしもWin7が調べられたら、Win7時の処理時間を
教えて頂けないでしょうか。
現状、一番問題視しているのはWin7とWin10の速度差です。

> igyさん
リアルタイムプロテクションの設定のON/OFFでは、時間差はありませんでした。
またCPUは異なりますが、他のPCで同確認を行っても差が出ております。

仮想環境は利用しておりません。
OSはSSDにすべてインストールをしております。


TK  2019-02-15 05:59:25  No: 49679

ProcessMoniterを利用して、処理時間を見てみました。

=== Win7(x86) ===
"20:14:28.0000663","test.EXE","2120","WriteFile","D:\Time_0.txt","SUCCESS","Offset: 200,668,544, Length: 128"
"20:14:28.0000714","test.EXE","2120","WriteFile","D:\Time_0.txt","SUCCESS","Offset: 200,668,672, Length: 128"
"20:14:28.0000744","test.EXE","2120","WriteFile","D:\Time_0.txt","SUCCESS","Offset: 200,668,800, Length: 128"
"20:14:28.0000777","test.EXE","2120","WriteFile","D:\Time_0.txt","SUCCESS","Offset: 200,668,928, Length: 128"
"20:14:28.0000808","test.EXE","2120","WriteFile","D:\Time_0.txt","SUCCESS","Offset: 200,669,056, Length: 128"

=== Win10(x86) ===
"20:47:38.9394942","test.EXE","724","WriteFile","D:\Time_0.txt","SUCCESS","Offset: 28,518,144, Length: 128"
"20:47:38.9395117","test.EXE","724","WriteFile","D:\Time_0.txt","SUCCESS","Offset: 28,518,272, Length: 128"
"20:47:38.9395277","test.EXE","724","WriteFile","D:\Time_0.txt","SUCCESS","Offset: 28,518,400, Length: 128"
"20:47:38.9395416","test.EXE","724","WriteFile","D:\Time_0.txt","SUCCESS","Offset: 28,518,528, Length: 128"
"20:47:38.9395555","test.EXE","724","WriteFile","D:\Time_0.txt","SUCCESS","Offset: 28,518,656, Length: 128"

=== Win10(x64) ===
"20:09:55.0815295","test.EXE","7352","WriteFile","D:\Time_0.txt","SUCCESS","Offset: 41,627,264, Length: 128"
"20:09:55.0815612","test.EXE","7352","WriteFile","D:\Time_0.txt","SUCCESS","Offset: 41,627,392, Length: 128"
"20:09:55.0815883","test.EXE","7352","WriteFile","D:\Time_0.txt","SUCCESS","Offset: 41,627,520, Length: 128"
"20:09:55.0816149","test.EXE","7352","WriteFile","D:\Time_0.txt","SUCCESS","Offset: 41,627,648, Length: 128"
"20:09:55.0816466","test.EXE","7352","WriteFile","D:\Time_0.txt","SUCCESS","Offset: 41,627,776, Length: 128"

Win7(x86):3〜5us間隔
Win10(x86):15〜30us間隔
Win10(x64):15〜30us間隔

私の環境ではこんな結果になり、最終的にはスレの最初に記述したような
処理時間になります。
ただネットで検索してもあまり、Win7とWin10の速度差について異なるという
記述を見つけることができませんでした。

「私のPCでは一緒の値が出る(もしくは出ない)」という情報だけでも助かります。

以上、よろしくお願いいたします。


igy  2019-02-15 06:11:00  No: 49680

各OSで、
Windows 7のHDDキャッシュ方式
https://torutk.hatenablog.jp/entry/20111103/p1
にある、「デバイスの書き込みキャッシュを有効にする」の設定は、
どのようになってますか?


TK  2019-02-15 07:33:52  No: 49681

>igyさん

返信ありがとうございます。
ディスクの書き込みキャッシュを確認しました。

全OSで「有効」になっておりました。


igy  2019-02-15 08:49:29  No: 49682

(関係ないかもしれませんが・・)
電源オプションが「省電力」になってたり、
Trimの実行が必要だったり・・とかは、いかがですか?

最後にTrimが実行されたのはいつ?  結構前なら手動で実行しよう
https://forest.watch.impress.co.jp/docs/serial/win10tips/1060703.html


take  URL  2019-02-15 18:39:01  No: 49683

Delphiに関係無くWindows10で新規ファイル生成や書き込みが異常に遅いという現象を確認しています。
全てのファイル書き込み処理を確認しているわけではありませんが
同名のファイル名での上書きは時間がかかるのですが、追記は遅くないようです。

https://answers.microsoft.com/ja-jp/windows/forum/windows_10-files-winpc/%E5%B0%8F%E3%81%95%E3%81%AA%E3%83%95%E3%82%A1/6b22a9e3-020c-433a-8730-c14d81851ebc?auth=1


TK  2019-02-15 20:09:20  No: 49684

完全な解決ではありませんが、Win7/Win10の速度差がほぼないところまで改善できました。

原因としましては、私がアローケーションユニットサイズを考慮していないことが大きいのだと思います。
またアローケーションユニットサイズを考慮しない場合、Win7とWin10で速度差が顕著に出るようです。
以下が参考にしたサイトです。
https://pc-kaizen.com/what-is-allocation-unit-size

アローケーションユニットサイズを考慮して、8KB単位で書き込みをするようにしたのですが、
Writeln()関数はどんなに長い文字を送っても、128byte単位で書き込みが行われておりました。
よってWriteln()では改善が見込めないため、FileWrite()を利用するように作り変えました。

FileCretae()
FileWrite()
FileClose()

を利用しスレの最初で述べたものと同じファイルを8KB単位で書き込んだ場合、以下のようになりました。

Win7(x86):8秒
Win10(x86):8秒
Win10(x64):7秒

OSによる差はなくなりました。
根本的な原因はわからないのですが、この対応で一度手を置こうと思います。

解決に向けてご尽力頂けた、ウォレスさん、igyさん、takaさん、本当にありがとうございました。


Taro  2019-02-16 01:20:20  No: 49685

Windows 10 pro(x64), CPU=i7, 39.76
Windows XP pro     , CPU=Corei4, 69.15
Windows 10 Home(x64), CPU=AMD A9-9420e 1.8GHz, 137.91

いずれも USB3.0 外付けのHDDでテストしました。
XP は USB2.0 でしょう。


TK  2019-02-17 06:27:44  No: 49686

>Taroさん

調べて頂いた値は参考にさせて頂きます。
確認ありがとうございました。


※返信する前に利用規約をご確認ください。








  このエントリーをはてなブックマークに追加