はじめに
Delphi 5で作成されていたインターフェイス用のコンソールアプリケーションがあり、C# に作り変えました。
ただ社内検証では問題が発生しなかったが、ユーザー環境では1回ごとの起動処理が3秒ほどかかるとして導入が見送りになりました。その後にいろいろ調査して、固定IPアドレスとプロクシの自動検出が原因でした。
【.NET】HttpClientの初回が遅いのはプロクシの自動検出が原因
起動処理が3秒ほどかかる問題は解決したものの、導入は1年以上経っても何故か進みません。Delphi 5版は長年使用していて安定しているってのもありますが、Delphi 5版 と C#版 のWindows 7での性能検証で差が出ているのが一つの要因になっているのかも知れません。ただ作業者の運用を考えたら問題ないレベルではあると思っているのですが説得できる材料が乏しいのか、他の言語で作成した場合とDelphiの最新版に変更した場合の開発工数の依頼がきてました。
仕様
C++ のアプリケーション側から、CreateProcessでexe形式のインターフェイスを呼ぶようになっています。
インターフェイス側では呼び出し側から渡されたパラメーターを解析して、Webサーバー(IIS 10.0 + ASP.NET + Classic ASP)で処理(DBアクセス等)をして、結果をテキストファイル(Result.txt)に返すようになっています。
.NET 5.0に移植
来年の2月頃に、Raspberry Piで動作させる依頼がくるかも知れないということで、.NET Framework 4.x から .NET 5.0 に移植してみました。Raspberry Piの実機がないので動作するかはまだ確認していません。
「'shift_jis' is not a supported encoding name.」のエラーになった以外は、問題なく移植できました。
.NET CoreでShift-JISを取り扱う方法
性能検証
環境
- ① Windows 10 IoT 64bit Intel Core(TM) i3-8145U CPU 2.10GHz 2.30GHz メモリ 4.0GB
- ② Windows 10 Pro 64bit Intel Core(TM) i7-8565U CPU 1.80GHz 2.00GHz メモリ 8.0GB
- ③ Windows Server 2016 Intel Xeon CPU 3 E3-1220 v6 3.00GHz 3.00GHz メモリ 16.0GB
①は工場などの制御端末や組み込み端末用で「機能更新プログラム」が提供されず10年間機能固定でご利用するもの。
②は会社で支給された自分が現在使用しているもの
③はサーバーです。インターフェイスはクライアントPC側で動かすものなので参考用です。
インターフェイスアプリケーションは、Windows 7 PCでも動作するように 32bitアプリケーション(x86)になっています。
検証方法
C++でCreateProcessでexe形式のインターフェイスアプリケーションを呼び出し、処理時間のログを出力するだけのドライバアプリケーションを作成して4回実行します。ただ初回のみ時間がかかる(コールドスタートアップ)ため除外、実質3回の平均を取ります。
- Delphi
- .NET Framework 4.x
- .NET 5.0
- .NET 5.0 自己完結型
※自己完結型は、ランタイム込みで配布先に.NET 5.0がインストールされていなくても動く形式です。
検証実施
平均は初回のみ除外
① Windows 10 IoT 64bit Intel Core(TM) i3-8145U CPU 2.10GHz 2.30GHz メモリ 4.0GB
プラットフォーム | 初回 | 2回目 | 3回目 | 4回目 | 平均ms |
---|---|---|---|---|---|
Delphi | 2188 | 636 | 652 | 601 | 629.7 |
.NET 4.x | 8618 | 785 | 629 | 690 | 701.3 |
.NET 5.0 | 4497 | 874 | 817 | 841 | 844 |
.NET 5.0 Self | 3301 | 1253 | 1218 | 1237 | 1236 |
② Windows 10 Pro 64bit Intel Core(TM) i7-8565U CPU 1.80GHz 2.00GHz メモリ 8.0GB
プラットフォーム | 初回 | 2回目 | 3回目 | 4回目 | 平均ms |
---|---|---|---|---|---|
Delphi | 495 | 299 | 292 | 270 | 287 |
.NET 4.x | 2704 | 295 | 358 | 355 | 336 |
.NET 5.0 | 1496 | 559 | 637 | 578 | 591.3 |
.NET 5.0 Self | 2560 | 1787 | 1763 | 1817 | 1789 |
③ Windows Server 2016 Intel Xeon CPU 3 E3-1220 v6 3.00GHz 3.00GHz メモリ 16.0GB
プラットフォーム | 初回 | 2回目 | 3回目 | 4回目 | 平均ms |
---|---|---|---|---|---|
Delphi | 349 | 116 | 112 | 119 | 115.7 |
.NET 4.x | 1047 | 128 | 116 | 114 | 119.3 |
.NET 5.0 | 429 | 240 | 212 | 234 | 228.7 |
.NET 5.0 Self | 917 | 460 | 432 | 418 | 436.7 |
結果まとめ
Delphi と .NET Framework 4.x については同等性能です。※Delphi版はネイティブコードです。
.NET 5.0 に関しては、パフォーマンスが向上したと聞いていたが、この検証においては100ms〜200ms遅いです。
.NET 5.0 自己完結型は、exeサイズが大きいだけあって今回のように随時呼ばれるのには向いてないです。Windows ServerくらいPC性能がよければ使用しても問題ないでしょう。
最後に
.NET 5.0 に関しては、パフォーマンスが向上したと聞いていたので少し残念な結果です。でも、Raspberry Piはコンパイルするだけで動作するようになるのだから、開発効率はいいです。とはいえ、Raspberry Piで試してないので遅くて使い物にならなかったら、C++あたりで作り直すことになるのかも。
ユーザー側はWindows 7のPCがまだ大半なので、本来はWindows 7の性能検証結果を入れたかったのですが、環境準備が整わなかったので今後追加しておきます。また、Raspberry Piも検証できる環境ができたときには反映しておきます。