Cygwin + MinGW + GCC 相談室 Part 8
Windows 10, WSL, Ubuntu 18.04 で、 VSCode の拡張機能、Remote WSL も使う Linux側には、日本人が作った、バージョンマネージャーのanyenv で、rbenv, nodenv を使って、 ruby 2.6.6, node 12.16.2 を入れた yarn は、Windows側に入れて、WSL から、拡張子なしのyarn コマンドを呼べる。 これは、#!/bin/sh で始まるシェルスクリプト anyenv は多言語向きで、rbenv, nodenv, pyenv, phpenv などを同じ使い方で、統一的に扱える。 ~/.bashrc に、下の2行を追加するだけで、各言語ごとに追加しないでも良い export PATH="$HOME/.anyenv/bin:$PATH" eval "$(anyenv init -)" MSYS+MinGW、仮想マシン+Linuxって感じでWSLの入る余地がない WSL+MinGWツールチェーンにすれば仮想マシンすら必要ないって考えもあるけど やっぱり仮想マシンは手放せないからWindows側はMSYSでいいやってなる >>653 MSYS+MinGWで何作ってるの? Windowsアプリ? まあWindowsアプリしかないよね。 WSLはLinuxアプリを作って動かすものなので目的が違うよ。 仮想マシンは手放せないけど、仮想マシンはほぼテスト環境になった 作ったアプリを動かすための環境 普段の開発でテストのためだけの環境を使う気にならない 起動重いしメモリ食うし msys+mingw入れて何がしたい? ffmpegをビルドしたいから ああ、なるほど。テスト環境じゃないから 一つしか仮想マシンがないんだな それぞれ微妙に異なるからテスト環境(仮想マシン)は プロジェクトごとに必要なんだよ >>658 LinuxツールのWindowsネイティブ版への移植以外になんかあるの? ffmpegもそうだし まあ全員がWSLをインストールしてるとは限らないから Windowsネイティブ版を作る意味はあるだろうね。 cygwin mingw wsl 作ったアプリの動作時オーバーヘッド(動作速度)が大きい順に並べて マジかよWSLに失望しました。窓から投げ捨ててMinGWに乗り換えます >>665 結論ありきの質問だからねw 使ってみればわかる。 WSLが一番軽いし一番正確に動く。 mingw-w64-〇〇〇-yasm-1.3.0-4 (は32bit用はi686、64bit用はx86_64) yasm-1.3.0-2 どう違うの? 入れるのはどっち? 前者はMinGW-w64のDLLが必要。いわゆるネイティブアプリ 後者はMSYSのDLLと場合によってはターミナルエミュレータが必要 どちらを使うかは環境と用途次第 msys2を入れてpacman -Syuをやった後、home/PC名のフォルダに、.gnupgというフォルダがあるんだけど、これって消しちゃダメ? え!?WSLってそのままでは音流せないんですか!? gnupgってGPGだろ GNU製のPGP暗号化と復号プログラム >>671 PulseAudio使えばいいだけじゃね? ではWSLは、デフォルトでは音すら流せない杜撰な造りをしていると認めるんですか? 単にサウンドデバイスを実装してないだけだよ 設計は良く出来てるので実装しようと思えば出来るだろうが 利用者が求めてない機能なので優先度が低い WSLの利用者は開発者だからね。開発者が欲しい機能が最優先 あ、もしWSLが開発者向けの機能を優先してるのを知った上で WSLは駄目だって印象を与えようとした書き込みだったらごめん、邪魔したね そうでないなら音ならWindowsで鳴らせばいいと気づければOKだよ 音を鳴らす程度のためにWSLは不要だからね >>653 wslはwslのコマンドラインからlinuxバイナリもwindowsバイナリも動く優れものなんだよ >>677 そうそう。だからbashのシェルスクリプトで Windowsのコマンドを実行してOSの設定を変更するとかできちゃう Windowsのコマンドプロンプト側からWSLのディレクトリに入っていけるの? >>679 それはコマンドプロンプト自体の問題で、こいつは古いアプリなのでUNCパスに対応していない UNCパス(\\ではじまるネットワークフォルダのパス)を扱えるツールを使う必要がある WSLのディレクトリに対応してるかというよりも ネットワークフォルダに対応しているかという話に近い PowerShellはUNCパスに対応しているからWSLのディレクトリにも入れる コマンドプロンプトから実行するコマンドもUNCパスに対応していれば参照できる またネットワークフォルダはドライブに割り当てることが出来るので ドライブに割り当てればコマンドコマンドからWSLのディレクトリに入ることも出来る ちなみにcdの代わりにpushdを使えば コマンドコマンドからUNCパスに移動できる 一時的にドライブを割り当てているだけだが 詳しい情報サンクス! これなら皆がWSLへl移行するのもわかる気がする windowsのSSHサーバ立ち上げてwslをシェルにできるのは便利 PowerShell極めてるひとなら不要かもしれんけどね マジレスするとmsys使ってて問題無ければwsl要らない >>684 共存できる。msys2はただのアプリでしかないから >>685 msysの問題はUbuntuと同じようなメンテナンス力を期待できないところかな WSLは本物のUbuntuのディストリのパッケージが使われてるので Ubuntuとほぼ同等にメンテナンスされてると思っていい だけどmsysは(Ubuntuと比べたら小さな)開発者が対応してるパッケージしか使えない しかもLinuxと完全互換じゃないからmsysでソースコードからコンパイルしようとしても 動くとは限らない。WSLを使えばそういった煩わしさから開放される。 msysはWSLを入れてない人のためのWindows用アプリを作るためのものだよ 開発者がLinuxの代わりとして使うものじゃない >>687 シンボリックリンクでホームディレクトリ以下から アクセスしやすくするのがおすすめ 色々と混ざらないし複数のディストリでも共有できる 色々と混ぜたいからホームディレクトリを一緒にするんだろ そうじゃなければ最初から分けとけばいいだけの話だ >>689 「色々」と混ぜたいならその「色々」だめを混ぜればいいじゃん 全部混ぜる必要はない 「色々」と混ぜたいならその「色々」だけを混ぜればいいじゃん Microsoft Store に WSL Ubuntu 20.04 LTS 出てるけど、まだ入れない方がいいんですか 早くても、8月以降に、20.04.1 とか修正版が出た後。 1年後でも良い Ruby のirb では、MSYS2/MinGW で、日本語入力でバグるから、 WSL の方が、互換性が高い 日本人が作った、バージョンマネージャーのanyenv で、rbenv, nodenv で、 色々なバージョンも入れられる VSCode も、Remote WSL 拡張機能で、Linux 側へアクセスできる >>679 コマンドプロンプト・PowerShell で、wsl と入力すれば、WSLが起動する 最も良いのは、Linux 側のフォルダのショートカットをデスクトップにでも作って、 そのフォルダの右クリックメニューから、VSCode を起動する これで、WSLを起動して、Linux側のプロジェクトを開ける wsl, opensuse leapにmingw64入れてクロスビルドしてる。 configure作って--hostでmingw指定すれば楽勝すぎて屁が出そう 自分が使っているWSLが1なのか2なのか知る方法は? openSUSE Leap 15.1用のmingw配布消えとるやん くそがー そもそもWSL2はエンスー向けか 普通の人は1が入ってるのか MinGWっていうかGitBash環境なんだけど WSL1より2倍ぐらいシェルスクリプトが遅いんだよね どこが原因かわからんけどこんなもん? なにか大きな差がでるポイントでもあるんかね? 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倍の差がでてるから もうこれはどうしようもないのか? 比較とか計算が遅いのかと思ってやってみたけど この比率は変わらない 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の処理だけなはずなんだけどなぁ 調べるとradeonのドライバを切れとか書いてあるけど… radeonの話は画面に出力が絡むなら 関係ありそうな気もするけど、それ以外でも発生するんだろうかね あとHOMEは MinGWは /c/Users/myname Cygwinは/home/mynameだ よく見ると大きな差があるのはuser空間だから コンパイルオプションが違ってるとかなのかな? seq使うんじゃなくて{1..1000000}の方がいいかもね >>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でも使ってるんじゃなかったっけ? >>708 を、WSL1, Ubuntu 18.04 で、3回やった。 8GB メモリ、CPU-i3・エコモード real 0m4.680s user 0m4.234s sys 0m0.453s ちなみに俺のはCPUはi7な Cygwin、MinGWを実行したら それの2倍かかるはず cygwinはforkがヘボいから遅い MinGWといいつつmsysのbashやろ これもforkがcygwinゆずりだから遅い。 wslもfork遅いと思うけど。 virtual boxにwindowsファイルを共有させたものの方が実は速い。 純粋にwindowsとLinuxの環境を同居させたきゃ仮想PC Linuxでwindows binaryをクロスビルド、テストまでしたけりゃwsl まあ名前解決のところと passwd/group の設定はしといた方がいいね >>712 forkが遅いのはわかってるけど、 このコードでforkなんて大量にはしないだろ? time bash -c 'for i in {1..1000000}; do :; done' 元々、bash が、ループ向きではないから、dash などを使う for は遅いから、while などを使う。 実行時間中のほとんどが、フォークの時間 ループは、awk, perl, ruby などでは、0.1 秒も掛からない。 単一プロセス中の処理だから あ、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 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 for がコマンドだから、フォークされるのだろ。 だから、シェルスクリプトでは、while を使えと言われる bash よりも、dash を使う。 それ以上は、awk, perl, ruby 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と大差ないので省略 8年前のシェルスクリプトの本には、 10万行の処理で、 for : 9分 while : 5秒 awk/perl : 0.1秒 $((i+1)) という部分が、コマンドだから遅いのだろう ほとんどが、そのフォーク時間 せいぜいbashのサブコマンドで、forkしとらん気がする ただマルチスレッドは使ってるかも知れんし、その際のメモリ操作はなんか性能の問題があった気はする $(())内でiを更新できることから分かるようにforkしていないし、少なくともbashとdashはシングルスレッド linux上で ltrace -f bash -c 'for i in {1..1000000}; do :; done' したら、mallocを何度も呼んでいるようだから、ヒープ操作関係が遅い可能性はある 実際、linux上でもmallocの実装をglibcのからjemallocに切り替えたら上のループが2割近く速くなった wsl2は仮想マシンになるのか windowsバイナリ実行できるのかな 以下のパッケージ、入れようとすると対象が見つからないと出るんだけど・・・ dlfcn libpng tools-git jq clang WSL, Ubuntu 18.04 には、jq もあるけど apt-cache show jq メンテナー : 陳昌倬 >>727 ないんだろ?Cygwinは独自のディストリ Windowsに移植できたもの、自分が関心があるパッケージしか 登録されていない MSYS2でWin32アプリ作ってみようとチャレンジ中 msys2をサイレントインストールするにはどうしたら良いですか? WSL2で 9PFs 経由でWin32側のファイルを読み込むの、なんでこんな遅いの? 仮想マシン経由だからでは? だからWSL1も引き続き開発してるわけで 同意。mingwは存在意義があるけど、cygwinは役割を終えた。 mingwは「Git For Windows」のバンドルモジュールとしてしぶとく生き残る。 cygwinはdll依存をなくしてmingwに統合されていくでしょ。 それを言ったらGit Bashはmsys2のbashだが、bashがmingwに移植されるとは思えんな gcc -staticがデフォじゃないのがよくわからん じゃあMinGWの立ち位置って何よって bash使いたいならbusybox-w32を使えばいいじゃない MinGWの立ち位置? Win32アプリをビルドできるGCC環境 read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる