[過去ログ] Go language part 4 (1002レス)
1-

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
1: デフォルトの名無しさん [sage] 2020/11/16(月) 04:14:40 ID:fB5+0hxC(1/3) AAS
Goについて扱うスレッドです。
GoはGoogleによって開発された言語です。

公式
外部リンク:golang.org

公式ドキュメント
外部リンク:golang.org

公式外パッケージドキュメント
外部リンク:godoc.org

ブラウザ上で試し書き
外部リンク:play.golang.org

※前スレ
Go language part 3
2chスレ:tech
978
(1): デフォルトの名無しさん [sage] 2022/02/26(土) 21:59:12.46 ID:4mZJSMD8(2/4) AAS
>>975
975(1): デフォルトの名無しさん [sage] 2022/02/26(土) 21:35:40.76 ID:yRlIqUsp(8/9) AAS
>>974
それは処理系標準?それとも準標準?
RustはGoと真逆で標準ライブラリとは最小限のものに限る位置付けなので
標準ライブラリには非同期ランタイムを作るための枠組みだけが存在していてランタイム自体は無しだよ
これは全ての分野について同じ方針でRustでは標準+準標準(デファクトスタンダード)を使ってプログラミングをするよ
979
(1): デフォルトの名無しさん [sage] 2022/02/26(土) 22:13:34.76 ID:4mZJSMD8(3/4) AAS
>>976
976(1): デフォルトの名無しさん [sage] 2022/02/26(土) 21:58:06.53 ID:kpnhrKVl(8/10) AAS
>>974
それ以下と定義が同じだと、一般的には「ワークスティーリング方式」を「スレッドプール」と呼称するよ。(だからC#のもこれのはずだけど)
外部リンク:tech-blog.optim.co.jp
Rustで何故あえて方言にしているのかは知らん。
というかワークスティーリングじゃない方のメリットなんてない気がするんだが。
そこは一般的は話としてまずOSスレッド毎にキューと持つかグローバルにキューを持って割り振るかの2大方式があるよ
それぞれに利点と欠点があってそこは省略するけど
GoもRustもそのハイブリッド方式となっていて普段はスレッド毎にキューを持って各OSスレッドが独立に効率よく処理だね
そしてGoもRustもグローバルにも管理して暇なOSスレッドが生じるとそこへ割り振る(OSスレッドから見るとスティール)するよ
詳細はここで書ききれないほどもう少し複雑だから省略してる点はそれぞれの解説サイトなどを見てね
980
(2): デフォルトの名無しさん [sage] 2022/02/26(土) 22:54:22.46 ID:kpnhrKVl(9/10) AAS
>>979
Goと同じなら805のリンクの内容と同じだからああそうですか程度。
資料が古いがC#のは以下で確認した。同様にハイブリッドでスティーリングもあり。
(ただ.NET6.0とかだともう変わってそうだが)
外部リンク[html]:ufcpp.net
基本グローバルキューで、ただし優先順位はローカルキュー>スティーリング>グローバルキューになってる。
この構造はまあ納得。

> GoもRustもそのハイブリッド方式となっていて普段はスレッド毎にキューを持って各OSスレッドが独立に効率よく処理だね
> そしてGoもRustもグローバルにも管理して暇なOSスレッドが生じるとそこへ割り振る(OSスレッドから見るとスティール)するよ
無駄に複雑で余計に遅くなると思うけどね。.NETの方が単純ですっきりしてていい。
グローバルキューから取り出す時の競合を気にしてるのなら、
Goみたいに100,000goroutineとか目指す場合は分かるけど、Rustは基本そうじゃないだろうから、チューニングミスだと思うけど。
981: デフォルトの名無しさん [sage] 2022/02/26(土) 23:02:07.46 ID:Gc6jVciw(1) AAS
Goは別に最速を目指している言語じゃないからね
もし何かのベンチマークが最速になってしまったら逆に驚くよ
そのベンチ間違ってるだろ、って。
982
(3): デフォルトの名無しさん [sage] 2022/02/26(土) 23:40:35.78 ID:BX4iLvdt(2/2) AAS
>>977
977(1): デフォルトの名無しさん [sage] 2022/02/26(土) 21:58:10.74 ID:nPeFYJEF(1) AAS
>RustもGoと同じM:Nモデルでワークスティーリングもしているよ

VMじゃないのにどうやって実現してるのかな
VMじゃないと起きる問題点は何?
いずれにせよC/C++/RustはVMでもOSでも記述できるのだからそこに不可能は無い

>>980
言語に関係なくシステムスレッド間のグローバルな操作はデータ競合回避など一定のコストがかかる
だから可能な限り個別にシステムスレッドが動くようにしつつアイドルが出ないよう最小限のグローバル操作
この部分はよほど上位で制約のある仕様としていないならば全ての言語で同じ
983: デフォルトの名無しさん [sage] 2022/02/26(土) 23:48:39.58 ID:yRlIqUsp(9/9) AAS
>>978
これがなぁ…。過渡期は混ぜるな危険で困らない?そこが不安。
Rustも良いとは思うんだけど、爪切るのにハサミ使ってる気分になる。
984: デフォルトの名無しさん [sage] 2022/02/26(土) 23:59:29.99 ID:kpnhrKVl(10/10) AAS
>>982
それはハードによる。
x86はハードウェアでキャッシュコヒーレンシを取ってくれるので実は共有RAMでもコストは安い。
.NETがローカルキューからの取り出しでFIFOとFILOで競合が減るから、というのはそういう事。
Goの場合はARMを見てるのか、MacがARMに乗り換える布石だったのか、
以前からやたら「共有RAMは遅いから使わない」としてきてるが、
ぶっちゃけx86の場合は
(書き込み頻度と量によるが、タスクの起動=関数ポインタ1つと引数のポインタ程度なら)
OSを利用したチャネル接続よりも共有RAMの方が実は速い。
ここら辺を理解してない奴がグダグダやってるからチューニングし切れてないのだと思うよ。
985
(1): デフォルトの名無しさん [sage] 2022/02/26(土) 23:59:34.35 ID:4mZJSMD8(4/4) AAS
>>980
>> Goみたいに100,000goroutineとか目指す場合は分かるけど、Rustは基本そうじゃないだろうから、

Rustの非同期タスクはGoroutineよりも更に軽くて
Goとは異なりスタックレスなので付加メモリ消費も非同期ランタイムの管理データ分の1タスクあたり64bytesで済みますよ
そしてグローバルキュー競合コストの件は>>982のように同じですね
986: デフォルトの名無しさん [sage] 2022/02/27(日) 00:02:30.74 ID:2GGoVw4G(1) AAS
>>982
問題があると言っているわけじゃなくて、VMやOSじゃなければプリエンプションできないからどうやっているのかなと。
987: デフォルトの名無しさん [sage] 2022/02/27(日) 00:03:38.38 ID:uWHjNeVw(1/8) AAS
>>973
973(3): デフォルトの名無しさん [sage] 2022/02/26(土) 20:31:14.25 ID:kpnhrKVl(7/10) AAS
>>969
> 学習コストに対しての性能パフォーマンスが異様に高い
Cの方が高いけどな。Goよりも小さい仕様で速い。
あとC#もGUIはゴミだぞ。それ以外がいいからunityを制覇してるが。
Cはお爺ちゃんだから…
Cからの乗り換えコストっていう視点でどうかひとつ

あ、でも実装系別の頭おかしくなるコンパイルオプションやらバウンダリやらのメモリモデル考えると、Goのほうが実質勝ってないか学習コスト?
988
(1): デフォルトの名無しさん [sage] 2022/02/27(日) 00:11:21.81 ID:uWHjNeVw(2/8) AAS
>>973
ちなみに速さやらサイズでは当然にCとかの圧勝だろ普通に
関数呼び出しごとにオーバーヘッドのかかるGoが単純な速度で勝てる道理はない
989: デフォルトの名無しさん [sage] 2022/02/27(日) 00:23:35.14 ID:uWHjNeVw(3/8) AAS
>>973
C#というか.Netのwpfは好き
一般的な手法じゃないだろうけど、MVVMのVM部分を単体テストできて(ディスパッチャ細工してメインスレッドで走らせる)
990
(1): デフォルトの名無しさん [sage] 2022/02/27(日) 00:44:59.79 ID:PVy06kKY(1/2) AAS
>>985
> Goとは異なりスタックレスなので
やたらこれを強調しているが、goでもgoroutineにローカルキュー(=関数ポインタの配列)を用意して、順に食わせれば、
各タスク毎にスタックを用意する必要なんて無くて、普通にエミュレーション出来るよ。
(ただしGo信者的にはこれは負けだからやらないとも思うが)

ただこの場合、各タスクが止まらない前提ならこれでいいが、
止めて切り替える分には一般的にはスタック領域が必要になる。
(自動変数を全部ヒープ上に確保すればスタック無しでもいいが、これは遅くなるので多分やってないと思う)
ユーザーが確保しなくていいだけで、実際はランタイムかコンパイラが確保してくれてるだけじゃないか?
991
(3): デフォルトの名無しさん [sage] 2022/02/27(日) 00:50:50.94 ID:PVy06kKY(2/2) AAS
>>988
> 関数呼び出しごとにオーバーヘッドのかかるGo
かからないような気がするが、自信はない。かかる理由って何?
992: デフォルトの名無しさん [sage] 2022/02/27(日) 02:41:36.05 ID:uWHjNeVw(4/8) AAS
>>991
Goは関数呼び出しごとにスタックをチェックして、不足してたなら拡大するから
関数ごとの静的な自動変数サイズと比較してるだけだと思うけど、そういう処理のおかげで初期スタックサイズを抑えてる
外部リンク:postd.cc
993: デフォルトの名無しさん [sage] 2022/02/27(日) 02:47:33.19 ID:uWHjNeVw(5/8) AAS
>>991
「十分な空間がない場合、ランタイムはヒープに対して大きなスタックセグメントを割り当て、現在のスタックの内容を新しいセグメントにコピーし、古いセグメントを解放し、それから関数呼び出しを再開します。」
994: デフォルトの名無しさん [sage] 2022/02/27(日) 03:00:02.25 ID:uWHjNeVw(6/8) AAS
>>991
毎回拡張する訳じゃないけどそのためのチェックは毎回走るんで、単にサブルーチンを呼ぶだけの他言語よりは余分な仕事をしている
おそらくチェックは必要な回数だけだとは思う(ループ内での呼び出しとかの最適化は考えてないとは思わないから)
995: デフォルトの名無しさん [sage] 2022/02/27(日) 06:52:35.32 ID:+yReYAPt(1/2) AAS
compiler explorer(外部リンク:godbolt.orgで、goコンパイル結果を普通のamd64用のアセンブラ見ること出来ないの?(Plan9でなく)
996: デフォルトの名無しさん [sage] 2022/02/27(日) 07:42:28.85 ID:uWHjNeVw(7/8) AAS
次スレ建ててくる
997: デフォルトの名無しさん [sage] 2022/02/27(日) 07:44:00.44 ID:uWHjNeVw(8/8) AAS
Go language part 5
2chスレ:tech
998: デフォルトの名無しさん [sage] 2022/02/27(日) 07:56:25.05 ID:nXG/aSfD(1) AAS
>>990
Rustの非同期タスクは内部的には単純な状態マシンとなり何度も再入可能なコルーチンと同じ状況になります
その中の変数はRustのクロージャがその環境の変数をキャプチャするのと同じだからもちろんメモリを確保します
だからスタックレスで何度も呼べるクロージャみたいな状況でスタック自体はプロセス全体で1本のままとなります
もちろんその非同期タスクから他の非同期でない普通の関数を呼べば通常と同じくスタックが伸びて使われていきます
一方でその非同期タスクから他の非同期な関数を呼ぶとその非同期タスクから一旦離脱してスケジューラーへ戻ります
最初に書いたように「単純な状態マシンとなり何度も再入可能なコルーチン」となっているので再び再開できます
以上がスタックレスなのにRustの非同期タスクがメモリの許す限り多く動くことができる仕組みです
999: デフォルトの名無しさん [sage] 2022/02/27(日) 08:07:16.26 ID:c9v4owXb(1) AAS
ワッチョイ無しかー(´・ω・`)
1000: デフォルトの名無しさん [sage] 2022/02/27(日) 08:16:41.16 ID:+yReYAPt(2/2) AAS
goroutineとC++標準ライブラリのスレッドを比較するために>>957
957(3): デフォルトの名無しさん [sage] 2022/02/26(土) 13:27:19 ID:fRC8OZTs(1/2) AAS
Goの(疑似スレッド+)goroutineのパフォーマンス計測っていいやつないの?
↓見つけたやつ
Goroutines Are Not Significantly Smaller Than Threads
外部リンク[html]:matklad.github.io
のmain.rsのC++版だけ作ってみた(ループは一桁減らした)
$ cat main.cc
#include <thread>
#include <chrono>
#include <vector>
using namespace std;
using namespace std::chrono;
int main() {
vector<unique_ptr<thread>> threads;
for (uint32_t i = 0; i < 1000; ++i) {
threads.emplace_back(
make_unique<thread>([=]{
uint64_t bad_hash = (i * 2654435761) % 200000;
this_thread::sleep_for(microseconds(bad_hash));
for (uint32_t _ = 0; _ < 1000; ++_) {
this_thread::sleep_for(10ms);
}
})
);
}
for (auto const& t: threads) {
t->join();
}
return 0;
}
$ g++ -O3 -pthread main.cc -o main && ./t ./main
real 11.04s
user 0.93s
sys 2.95s
rss 11328k
$
結果はmain.rsとほぼ同じで、やはりスレッド起動コストがデカく、rssもデカい
1001
(1): 1001 [] ID:Thread(1/2) AAS
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 468日 4時間 2分 1秒
1002
(1): 1002 [] ID:Thread(2/2) AAS
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。

───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。

▼ プレミアム会員登録はこちら ▼
外部リンク:premium.5ch.net

▼ 浪人ログインはこちら ▼
外部リンク[php]:login.5ch.net
1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.172s*