Cygwin + MinGW + GCC 相談室 Part 8 (988レス)
1-

700: デフォルトの名無しさん [] 2020/05/02(土) 23:21:47.63 ID:nkPqW+JC(1) AAS
MinGWっていうかGitBash環境なんだけど
WSL1より2倍ぐらいシェルスクリプトが遅いんだよね
どこが原因かわからんけどこんなもん?
なにか大きな差がでるポイントでもあるんかね?
701: デフォルトの名無しさん [sage] 2020/05/03(日) 03:37:53.54 ID:HUz+EFHq(1/8) AAS
WSL1 (bash 4.4.20) だと
$ time bash -c 'i=0; while [ $i -lt 1000000 ]; do : $((i+=1)); done'
real 0m6.317s
user 0m6.313s
sys 0m0.000s

MinGW64 (bash 4.4.23) だと
$ time bash -c 'i=0; while [ $i -lt 1000000 ]; do : $((i+=1)); done'
real 0m15.053s
user 0m15.000s
sys 0m0.030s

Cygwin (bash 4.4.12) だと
$ time bash -c 'i=0; while [ $i -lt 1000000 ]; do : $((i+=1)); done'
real 0m13.897s
user 0m13.858s
sys 0m0.046s

うーん、こんな単純なコードで2倍の差がでてるから
もうこれはどうしようもないのか?
702: デフォルトの名無しさん [sage] 2020/05/03(日) 04:04:18.44 ID:HUz+EFHq(2/8) AAS
比較とか計算が遅いのかと思ってやってみたけど
この比率は変わらない

WSL1
$ time bash -c 'for i in $(seq 1000000); do :; done'
real 0m2.159s
user 0m1.828s
sys 0m0.359s

Cygwin
$ time bash -c 'for i in $(seq 1000000); do :; done'
real 0m4.222s
user 0m3.889s
sys 0m0.341s

MinGW64
$ time bash -c 'for i in $(seq 1000000); do :; done'
real 0m4.821s
user 0m4.342s
sys 0m0.436s

WSL1 → Cygwin(2倍ぐらい遅い)→MinGW(さらに10%遅い)
こんな傾向がある。ファイルシステムは関係ないはず
やってるのはCPUの処理だけなはずなんだけどなぁ
703
(1): デフォルトの名無しさん [sage] 2020/05/03(日) 05:18:19.65 ID:1PSoskYy(1/2) AAS
調べるとradeonのドライバを切れとか書いてあるけど…
704: デフォルトの名無しさん [sage] 2020/05/03(日) 05:22:33.02 ID:HUz+EFHq(3/8) AAS
>>703
使ってないよw
705: デフォルトの名無しさん [sage] 2020/05/03(日) 05:24:47.68 ID:HUz+EFHq(4/8) AAS
radeonの話は画面に出力が絡むなら
関係ありそうな気もするけど、それ以外でも発生するんだろうかね
あとHOMEは MinGWは /c/Users/myname
Cygwinは/home/mynameだ
706: デフォルトの名無しさん [sage] 2020/05/03(日) 05:26:40.40 ID:HUz+EFHq(5/8) AAS
よく見ると大きな差があるのはuser空間だから
コンパイルオプションが違ってるとかなのかな?
707
(1): デフォルトの名無しさん [sage] 2020/05/03(日) 05:38:01.14 ID:1PSoskYy(2/2) AAS
seq使うんじゃなくて{1..1000000}の方がいいかもね
708
(1): デフォルトの名無しさん [sage] 2020/05/03(日) 06:00:40.65 ID:HUz+EFHq(6/8) AAS
>>707
つってもわずか一回だからなぁ。やってみてもいいけど

WSL1
$ time bash -c 'for i in {1..1000000}; do :; done'
real 0m1.710s
user 0m1.547s
sys 0m0.156s

Cygwin
$ time bash -c 'for i in {1..1000000}; do :; done'
real 0m4.854s
user 0m4.811s
sys 0m0.108s

MinGW64
$ time bash -c 'for i in {1..1000000}; do :; done'
real 0m4.934s
user 0m4.843s
sys 0m0.109s

あとあれから少しわかったのはMinGWは何回か繰り返せば
Cygwinに迫るのでファイル読み込み?とかも少し関連してるんだと思う
が2倍以上かかることに変わりはない

cygwin.dll?とかが遅いのかもな。MinGWでも使ってるんじゃなかったっけ?
709
(1): デフォルトの名無しさん [sage] 2020/05/03(日) 07:25:18.35 ID:69WKUEPM(1) AAS
>>708
を、WSL1, Ubuntu 18.04 で、3回やった。
8GB メモリ、CPU-i3・エコモード

real 0m4.680s
user 0m4.234s
sys 0m0.453s
710: デフォルトの名無しさん [sage] 2020/05/03(日) 07:38:38.22 ID:HUz+EFHq(7/8) AAS
>>709
いや比較しないと意味ないだろw
711: デフォルトの名無しさん [sage] 2020/05/03(日) 07:39:48.20 ID:HUz+EFHq(8/8) AAS
ちなみに俺のはCPUはi7な
Cygwin、MinGWを実行したら
それの2倍かかるはず
712
(1): デフォルトの名無しさん [sage] 2020/05/03(日) 21:39:24.17 ID:ADBK+oPb(1) AAS
cygwinはforkがヘボいから遅い
MinGWといいつつmsysのbashやろ
これもforkがcygwinゆずりだから遅い。
wslもfork遅いと思うけど。
virtual boxにwindowsファイルを共有させたものの方が実は速い。
純粋にwindowsとLinuxの環境を同居させたきゃ仮想PC
Linuxでwindows binaryをクロスビルド、テストまでしたけりゃwsl
713: デフォルトの名無しさん [sage] 2020/05/03(日) 21:47:49.28 ID:v0W4oGhj(1) AAS
まあ名前解決のところと passwd/group の設定はしといた方がいいね
714: デフォルトの名無しさん [sage] 2020/05/03(日) 23:40:13.01 ID:sXSeyux8(1) AAS
>>712
forkが遅いのはわかってるけど、
このコードでforkなんて大量にはしないだろ?

time bash -c 'for i in {1..1000000}; do :; done'
715
(4): デフォルトの名無しさん [] 2020/05/04(月) 02:27:10.75 ID:R/PLl+Gn(1/4) AAS
元々、bash が、ループ向きではないから、dash などを使う

for は遅いから、while などを使う。
実行時間中のほとんどが、フォークの時間

ループは、awk, perl, ruby などでは、0.1 秒も掛からない。
単一プロセス中の処理だから
716
(1): デフォルトの名無しさん [sage] 2020/05/04(月) 03:06:12.15 ID:szliIti6(1/5) AAS
あ、dashの結果書くの忘れてた。dashは速いから数を10倍にしてる
傾向は一緒。ただのループなのに2倍ぐらいの差が出てしまう

WSL1
$ time dash -c 'for i in $(seq 10000000); do :; done'
real 0m4.480s
user 0m2.875s
sys 0m2.047s

Cygwin
$ time dash -c 'for i in $(seq 10000000); do :; done'
real 0m7.598s
user 0m6.531s
sys 0m1.296s

MinGW64
$ time dash -c 'for i in $(seq 10000000); do :; done'
real 0m7.905s
user 0m6.905s
sys 0m1.155s
717: デフォルトの名無しさん [sage] 2020/05/04(月) 03:06:42.72 ID:szliIti6(2/5) AAS
>>715
どこでフォークしてるというの?
718: デフォルトの名無しさん [sage] 2020/05/04(月) 03:16:08.18 ID:szliIti6(3/5) AAS
awkは更に速いから、更に10倍にしてる。これなら理解できるな。
CygwinとMinGW64がWSL1より少し遅いのは起動時のパフォーマンスの差だろう
ってことはシェルスクリプトだと、なにか遅くなる処理をやってるってことか
整数型じゃないとか?

WSL1
$ time awk 'BEGIN{i=0;for(i=0;i<100000000;i++);}'
real 0m4.121s
user 0m4.109s
sys 0m0.016s

Cygwin
time awk 'BEGIN{i=0;for(i=0;i<100000000;i++);}'
real 0m4.978s
user 0m4.875s
sys 0m0.031s

MinGW64
$ time awk 'BEGIN{i=0;for(i=0;i<100000000;i++);}'
real 0m4.586s
user 0m4.562s
sys 0m0.015s
719: 715 [sage] 2020/05/04(月) 04:54:04.28 ID:R/PLl+Gn(2/4) AAS
for がコマンドだから、フォークされるのだろ。
だから、シェルスクリプトでは、while を使えと言われる

bash よりも、dash を使う。
それ以上は、awk, perl, ruby
720: デフォルトの名無しさん [sage] 2020/05/04(月) 05:14:01.45 ID:szliIti6(4/5) AAS
whileを使うと遅いからforに変えたのですが?
forを使った>>716とループ回数は同じ

WSL1
$ time dash -c 'for i in $(seq 10000000); do :; done'
real 0m4.480s
user 0m2.875s
sys 0m2.047s

$ time dash -c 'i=0; while [ $i -lt 10000000 ]; do i=$((i+1)); done'
real 0m15.811s
user 0m15.766s
sys 0m0.016s

Cygwin
$ time dash -c 'for i in $(seq 10000000); do :; done'
real 0m7.598s
user 0m6.531s
sys 0m1.296s

$ time dash -c 'i=0; while [ $i -lt 10000000 ]; do i=$((i+1)); done'
real 0m26.173s
user 0m26.109s
sys 0m0.031s

MinGWはCygwinと大差ないので省略
721: 715 [sage] 2020/05/04(月) 07:28:52.02 ID:R/PLl+Gn(3/4) AAS
8年前のシェルスクリプトの本には、
10万行の処理で、

for : 9分
while : 5秒
awk/perl : 0.1秒
722
(1): 715 [sage] 2020/05/04(月) 07:33:20.66 ID:R/PLl+Gn(4/4) AAS
$((i+1)) という部分が、コマンドだから遅いのだろう

ほとんどが、そのフォーク時間
723: デフォルトの名無しさん [sage] 2020/05/04(月) 07:37:26.49 ID:iIYyf/rd(1) AAS
せいぜいbashのサブコマンドで、forkしとらん気がする
ただマルチスレッドは使ってるかも知れんし、その際のメモリ操作はなんか性能の問題があった気はする
724: デフォルトの名無しさん [sage] 2020/05/04(月) 07:49:25.72 ID:szliIti6(5/5) AAS
>>722
コマンドじゃないよ
1-
あと 264 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.011s