C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

非同期でのコマンドプロンプト初回起動時について

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■91806 / inTopicNo.1)  非同期でのコマンドプロンプト初回起動時について
  
□投稿者/ Sf (1回)-(2019/08/05(Mon) 12:18:51)

分類:[C#] 

2019/08/05(Mon) 12:20:35 編集(投稿者)

初めまして、Sfと申します。

C#のProcess.Startを使用してコマンドプロンプトを起動する際、
初回起動時のみ異常に起動に時間がかかります。
二回目以降の起動はスムーズなので初回起動時のみの現象となっています。
ネット検索でもこの現象についての情報が得られず、解決が難しい状態です。

この現象の解決策をご存知の方はいらっしゃいますでしょうか?
環境はwindows10です。
引用返信 編集キー/
■91808 / inTopicNo.2)  Re[1]: 非同期でのコマンドプロンプト初回起動時について
□投稿者/ kiku (128回)-(2019/08/05(Mon) 13:03:38)
2019/08/05(Mon) 13:04:38 編集(投稿者)
下記のサンプルで、下記の環境でテストしてみましたが、
ご指摘のような初回時のみ遅くなる現象は発生しませんでした。
再現するコードを公開した方が良いと思います。

環境
 ・.NETFrameWork4.7.2
 ・Win10(64bit)
 ・WinFromアプリ

        private void button1_Click(object sender, EventArgs e)
        {
            System.Diagnostics.Process p = System.Diagnostics.Process.Start("notepad.exe");
        }

引用返信 編集キー/
■91809 / inTopicNo.3)  Re[1]: 非同期でのコマンドプロンプト初回起動時について
□投稿者/ Hongliang (850回)-(2019/08/05(Mon) 13:17:19)
それだけではなんとも答えづらいですが。

まず、「異常に起動に時間」というのは具体的にどのぐらい時間がかかるのでしょうか。Process.Startの前後でStopwatch.StartNew/Stopして、初回と2回目の時間を計測してみてください。
// もし初回が数百ミリ秒、2回目が数十ミリ秒、程度ならまあそんなもんでしょうとしか言えません。

それから「コマンドプロンプトを起動」ということですが、単純にProcess.Start("cmd.exe")してるだけなのか何らかの引数を与えているのか、どちらでしょうか。後者であれば、一旦cmd.exeを引数なしで起動して、先述のように計測してみてください。

アンチウィルスソフトの影響も考えられます。
作成した実行ファイルを監視対象から外して計測してみたらどうなるでしょうか。

後はどれぐらい意味があるか分かりませんが、
・Process.Startを呼び出す側の出力の種類はコンソールアプリケーションですか、Windowsアプリケーションですか?
・対象のフレームワークは何でしょうか?
・Windows 10ではバージョンが重要になります。スタートメニューの設定(歯車アイコン)からシステム - バージョン情報 と辿って、「Windowsの仕様」にバージョンが書かれています。
引用返信 編集キー/
■91811 / inTopicNo.4)  Re[2]: 非同期でのコマンドプロンプト初回起動時について
□投稿者/ Sf (2回)-(2019/08/05(Mon) 13:39:08)
回答ありがとうございます。
現象はコマンドプロンプト、またはパワーシェルを起動する際に発生します。
メモ帳などの実行では時間はかかりませんでした。

起動にかかる時間は20秒程です。
また、引数の有無に関わらず発生しました。
Process.Startを呼び出す側はWPFアプリケーションとコンソールアプリケーションで試し、どちらとも現象が発生しました。
Windows10のバージョンは1709でした。
引用返信 編集キー/
■91812 / inTopicNo.5)  Re[3]: 非同期でのコマンドプロンプト初回起動時について
□投稿者/ namara (1回)-(2019/08/05(Mon) 14:19:41)
> 現象はコマンドプロンプト、またはパワーシェルを起動する際に発生します。

cmdやPowerShellの呼び出しは、セキュリティソフトで監視されている可能性があります。
(現在はどうか分かりませんが、Process.Startでのcmd呼出が問答無用にブロックされてしまうセキュリティソフトもあります。)
Hongliang様の回答の通り、アンチウィルスソフトの影響を確認する必要があります。
引用返信 編集キー/
■91815 / inTopicNo.6)  Re[1]: 非同期でのコマンドプロンプト初回起動時について
□投稿者/ 魔界の仮面弁士 (2276回)-(2019/08/05(Mon) 14:40:16)
No91806 (Sf さん) に返信
> C#のProcess.Startを使用してコマンドプロンプトを起動する際、
> 初回起動時のみ異常に起動に時間がかかります。

起動先のアプリケーションが .NET 系のアプリケーションであるならば、
ログオン後の初回実行時にネイティブコードが生成されるため、
2 回目以降は高速、初回のみ遅いという事象が生じます。
http://okwakatta.net/topic/topic038.html


インストーラーあるいはログオンスクリプトなどで
ngen.exe を呼び出してキャッシュしておくと、初回から高速になります。
たとえば下記は、PowerShell の初回起動速度を高速化するためのものです。
https://gist.github.com/avin/532050e0937becc25fd4


なお、Windows Update 適用のタイミングで作成済みのキャッシュが
無効化されることがあります。これについては、Update 後に明示的に
ネイティブイメージの再作成をスケジューリングしておくことで対応してみてください。
https://blogs.msdn.microsoft.com/jpvsblog/2018/05/07/ngen/
引用返信 編集キー/
■91816 / inTopicNo.7)  Re[2]: 非同期でのコマンドプロンプト初回起動時について
□投稿者/ Sf (3回)-(2019/08/05(Mon) 14:53:17)
回答ありがとうございます。
使用しているPCが職場のものなのでアンチウイルスソフトについては試すことが出来ませんでした。

始めに記載しました初回起動時というはC#のアプリケーション内からコマンドプロンプトを初めて起動する際のことを指しております。
C#のアプリケーション上から二回Process.Startを呼び出してでコマンドプロンプトを起動する場合に一回目のみ時間がかかるという現象となっています。
そのため、C#アプリケーションを再起動した場合は再びコマンドプロンプトの起動が遅くなります。

説明が足らず申し訳ありませんでした。

引用返信 編集キー/
■91823 / inTopicNo.8)  Re[3]: 非同期でのコマンドプロンプト初回起動時について
□投稿者/ Sf (4回)-(2019/08/06(Tue) 12:14:24)
2019/08/06(Tue) 12:14:50 編集(投稿者)
2019/08/06(Tue) 12:14:44 編集(投稿者)

本日アンチウイルスソフトを切ってみたところ起動が早くなりました。
ご協力ありがとうございました。
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ