Goについて扱うスレッドです。
GoはGoogleによって開発された言語です。
公式
https://golang.org
公式ドキュメント
https://golang.org/doc/
公式外パッケージドキュメント
https://godoc.org
ブラウザ上で試し書き
https://play.golang.org
※前スレ
Go language part 3
https://mevius.5ch.net/test/read.cgi/tech/1571315884/
探検
Go language part 4
レス数が1000を超えています。これ以上書き込みはできません。
2020/11/16(月) 04:14:40.64ID:fB5+0hxC
984デフォルトの名無しさん
2022/02/26(土) 23:59:29.99ID:kpnhrKVl >>982
それはハードによる。
x86はハードウェアでキャッシュコヒーレンシを取ってくれるので実は共有RAMでもコストは安い。
.NETがローカルキューからの取り出しでFIFOとFILOで競合が減るから、というのはそういう事。
Goの場合はARMを見てるのか、MacがARMに乗り換える布石だったのか、
以前からやたら「共有RAMは遅いから使わない」としてきてるが、
ぶっちゃけx86の場合は
(書き込み頻度と量によるが、タスクの起動=関数ポインタ1つと引数のポインタ程度なら)
OSを利用したチャネル接続よりも共有RAMの方が実は速い。
ここら辺を理解してない奴がグダグダやってるからチューニングし切れてないのだと思うよ。
それはハードによる。
x86はハードウェアでキャッシュコヒーレンシを取ってくれるので実は共有RAMでもコストは安い。
.NETがローカルキューからの取り出しでFIFOとFILOで競合が減るから、というのはそういう事。
Goの場合はARMを見てるのか、MacがARMに乗り換える布石だったのか、
以前からやたら「共有RAMは遅いから使わない」としてきてるが、
ぶっちゃけx86の場合は
(書き込み頻度と量によるが、タスクの起動=関数ポインタ1つと引数のポインタ程度なら)
OSを利用したチャネル接続よりも共有RAMの方が実は速い。
ここら辺を理解してない奴がグダグダやってるからチューニングし切れてないのだと思うよ。
985デフォルトの名無しさん
2022/02/26(土) 23:59:34.35ID:4mZJSMD8986デフォルトの名無しさん
2022/02/27(日) 00:02:30.74ID:2GGoVw4G >>982
問題があると言っているわけじゃなくて、VMやOSじゃなければプリエンプションできないからどうやっているのかなと。
問題があると言っているわけじゃなくて、VMやOSじゃなければプリエンプションできないからどうやっているのかなと。
987デフォルトの名無しさん
2022/02/27(日) 00:03:38.38ID:uWHjNeVw >>973
Cはお爺ちゃんだから…
Cからの乗り換えコストっていう視点でどうかひとつ
あ、でも実装系別の頭おかしくなるコンパイルオプションやらバウンダリやらのメモリモデル考えると、Goのほうが実質勝ってないか学習コスト?
Cはお爺ちゃんだから…
Cからの乗り換えコストっていう視点でどうかひとつ
あ、でも実装系別の頭おかしくなるコンパイルオプションやらバウンダリやらのメモリモデル考えると、Goのほうが実質勝ってないか学習コスト?
988デフォルトの名無しさん
2022/02/27(日) 00:11:21.81ID:uWHjNeVw989デフォルトの名無しさん
2022/02/27(日) 00:23:35.14ID:uWHjNeVw990デフォルトの名無しさん
2022/02/27(日) 00:44:59.79ID:PVy06kKY >>985
> Goとは異なりスタックレスなので
やたらこれを強調しているが、goでもgoroutineにローカルキュー(=関数ポインタの配列)を用意して、順に食わせれば、
各タスク毎にスタックを用意する必要なんて無くて、普通にエミュレーション出来るよ。
(ただしGo信者的にはこれは負けだからやらないとも思うが)
ただこの場合、各タスクが止まらない前提ならこれでいいが、
止めて切り替える分には一般的にはスタック領域が必要になる。
(自動変数を全部ヒープ上に確保すればスタック無しでもいいが、これは遅くなるので多分やってないと思う)
ユーザーが確保しなくていいだけで、実際はランタイムかコンパイラが確保してくれてるだけじゃないか?
> Goとは異なりスタックレスなので
やたらこれを強調しているが、goでもgoroutineにローカルキュー(=関数ポインタの配列)を用意して、順に食わせれば、
各タスク毎にスタックを用意する必要なんて無くて、普通にエミュレーション出来るよ。
(ただしGo信者的にはこれは負けだからやらないとも思うが)
ただこの場合、各タスクが止まらない前提ならこれでいいが、
止めて切り替える分には一般的にはスタック領域が必要になる。
(自動変数を全部ヒープ上に確保すればスタック無しでもいいが、これは遅くなるので多分やってないと思う)
ユーザーが確保しなくていいだけで、実際はランタイムかコンパイラが確保してくれてるだけじゃないか?
991デフォルトの名無しさん
2022/02/27(日) 00:50:50.94ID:PVy06kKY992デフォルトの名無しさん
2022/02/27(日) 02:41:36.05ID:uWHjNeVw >>991
Goは関数呼び出しごとにスタックをチェックして、不足してたなら拡大するから
関数ごとの静的な自動変数サイズと比較してるだけだと思うけど、そういう処理のおかげで初期スタックサイズを抑えてる
https://postd.cc/performance-without-the-event-loop/
Goは関数呼び出しごとにスタックをチェックして、不足してたなら拡大するから
関数ごとの静的な自動変数サイズと比較してるだけだと思うけど、そういう処理のおかげで初期スタックサイズを抑えてる
https://postd.cc/performance-without-the-event-loop/
993デフォルトの名無しさん
2022/02/27(日) 02:47:33.19ID:uWHjNeVw >>991
「十分な空間がない場合、ランタイムはヒープに対して大きなスタックセグメントを割り当て、現在のスタックの内容を新しいセグメントにコピーし、古いセグメントを解放し、それから関数呼び出しを再開します。」
「十分な空間がない場合、ランタイムはヒープに対して大きなスタックセグメントを割り当て、現在のスタックの内容を新しいセグメントにコピーし、古いセグメントを解放し、それから関数呼び出しを再開します。」
994デフォルトの名無しさん
2022/02/27(日) 03:00:02.25ID:uWHjNeVw >>991
毎回拡張する訳じゃないけどそのためのチェックは毎回走るんで、単にサブルーチンを呼ぶだけの他言語よりは余分な仕事をしている
おそらくチェックは必要な回数だけだとは思う(ループ内での呼び出しとかの最適化は考えてないとは思わないから)
毎回拡張する訳じゃないけどそのためのチェックは毎回走るんで、単にサブルーチンを呼ぶだけの他言語よりは余分な仕事をしている
おそらくチェックは必要な回数だけだとは思う(ループ内での呼び出しとかの最適化は考えてないとは思わないから)
995デフォルトの名無しさん
2022/02/27(日) 06:52:35.32ID:+yReYAPt compiler explorer(https://godbolt.org/)で、goコンパイル結果を普通のamd64用のアセンブラ見ること出来ないの?(Plan9でなく)
996デフォルトの名無しさん
2022/02/27(日) 07:42:28.85ID:uWHjNeVw 次スレ建ててくる
997デフォルトの名無しさん
2022/02/27(日) 07:44:00.44ID:uWHjNeVw Go language part 5
https://mevius.5ch.net/test/read.cgi/tech/1645915400/
https://mevius.5ch.net/test/read.cgi/tech/1645915400/
998デフォルトの名無しさん
2022/02/27(日) 07:56:25.05ID:nXG/aSfD >>990
Rustの非同期タスクは内部的には単純な状態マシンとなり何度も再入可能なコルーチンと同じ状況になります
その中の変数はRustのクロージャがその環境の変数をキャプチャするのと同じだからもちろんメモリを確保します
だからスタックレスで何度も呼べるクロージャみたいな状況でスタック自体はプロセス全体で1本のままとなります
もちろんその非同期タスクから他の非同期でない普通の関数を呼べば通常と同じくスタックが伸びて使われていきます
一方でその非同期タスクから他の非同期な関数を呼ぶとその非同期タスクから一旦離脱してスケジューラーへ戻ります
最初に書いたように「単純な状態マシンとなり何度も再入可能なコルーチン」となっているので再び再開できます
以上がスタックレスなのにRustの非同期タスクがメモリの許す限り多く動くことができる仕組みです
Rustの非同期タスクは内部的には単純な状態マシンとなり何度も再入可能なコルーチンと同じ状況になります
その中の変数はRustのクロージャがその環境の変数をキャプチャするのと同じだからもちろんメモリを確保します
だからスタックレスで何度も呼べるクロージャみたいな状況でスタック自体はプロセス全体で1本のままとなります
もちろんその非同期タスクから他の非同期でない普通の関数を呼べば通常と同じくスタックが伸びて使われていきます
一方でその非同期タスクから他の非同期な関数を呼ぶとその非同期タスクから一旦離脱してスケジューラーへ戻ります
最初に書いたように「単純な状態マシンとなり何度も再入可能なコルーチン」となっているので再び再開できます
以上がスタックレスなのにRustの非同期タスクがメモリの許す限り多く動くことができる仕組みです
999デフォルトの名無しさん
2022/02/27(日) 08:07:16.26ID:c9v4owXb ワッチョイ無しかー(´・ω・`)
1000デフォルトの名無しさん
2022/02/27(日) 08:16:41.16ID:+yReYAPt goroutineとC++標準ライブラリのスレッドを比較するために>>957の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もデカい
$ 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もデカい
10011001
Over 1000Thread このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 468日 4時間 2分 1秒
新しいスレッドを立ててください。
life time: 468日 4時間 2分 1秒
レス数が1000を超えています。これ以上書き込みはできません。
ニュース
- 【子ども・子育て支援金】来年4月から徴収、月収50万円なら月600円程度…健保連試算 [蚤の市★]
- 【(・(ェ)・)】駆除数17倍、クマ1頭の焼却に灯油100㍑で今季7000㍑以上使用した施設も…処理に追われる自治体 [ぐれ★]
- なぜ立花孝志氏の言葉は信じられたのか…"異例の逮捕"が浮き彫りにした「SNSの危険な病理」 ★2 [ぐれ★]
- 【芸能】田中みな実 年始に実家に泊まらない理由明かす 「終わった感じがしちゃう。早く港区に戻らなきゃみたいな」 [冬月記者★]
- 高市首相告白「『なめられない服』を選ぶことに数時間を費やしました」「外交交渉でマウント取れる服、買わなくてはいかんかもなぁ」★4 [ぐれ★]
- 【ゲーム】たまごっちが買えない子ども続出! 父親たちが奔走も「10店舗電話しても買えない」 高額転売が相次ぎ、バンダイも困惑 [冬月記者★]
- 2025 SUPER FORMULA Lap19
- ハム専ファンフェス
- 2025 SUPER FORMULA Lap18
- 競輪実況★1606
- こいせん 全レス転載禁止
- 【フジテレビ】2025 FORMULA 1【NEXT】Lap600
- タリバン、G20遅刻、夕食会欠席 。 すまんこいつ何しに行ったの? [974680522]
- 【速報】高市早苗、G20サミット”社長出勤” [614650719]
- 【📛専】とうふさんすこすこ😊👎スレッド【とうふゲームズ🏡】
- 【悲報】高校ラグビー、マジで終わる… 強豪校ですら部員集まらず廃部へ この国の若者ってほんとトライしなくなったよな [452836546]
- 【速報】高市、今度はロシアに喧嘩を売る [329271814]
- 今日死ぬ予定がなかったけど死ぬやつってさ
