!extend:checked:vvvvv:1000:512
(新スレ立ての際上記コマンドを2行書き込んでください)
C言語の話題のみ取り扱います C++の話題はC++スレへ
質問には最低限の情報(ソース/コンパイラ/OS)を付ける
数行で収まらないソースは以下を適当に使ってURLを晒す
https://paiza.io/
https://ideone.com/
http://codepad.org/
C11
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1570.pdf
C99
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf
http://kikakurui.com/x3/X3010-2003-01.html
C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/
JPCERT C コーディングスタンダード
https://www.jpcert.or.jp/sc-rules/
※前スレ
C言語なら俺に聞け 154
https://mevius.5ch.net/test/read.cgi/tech/1578997950/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
探検
C言語なら俺に聞け 155
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ 76ba-P5bm)
2020/05/10(日) 23:20:27.99ID:Z3WQBr9X0549デフォルトの名無しさん (ブーイモ MMde-cWPK)
2020/07/15(水) 21:08:27.18ID:a3wypoikM このクイズ番組の回答者が読み方喋ってる
https://youtu.be/f7WPP-5GG58
https://youtu.be/f7WPP-5GG58
550デフォルトの名無しさん (ワッチョイ 41b3-6M5R)
2020/07/15(水) 21:53:44.85ID:JGqdiMCl0551デフォルトの名無しさん (アウアウエー Sa02-l+/r)
2020/07/16(木) 00:44:59.58ID:ZFOOaYp/a >>546
カルチュアコンビニエンスクラブ
カルチュアコンビニエンスクラブ
552デフォルトの名無しさん (ワッチョイ 9de6-YsWi)
2020/07/16(木) 04:02:23.42ID:CYft8xDJ0 >>550
イェェェ!!
イェェェ!!
553デフォルトの名無しさん (ワッチョイ 6905-YsWi)
2020/07/16(木) 09:30:43.69ID:UNVzIGjY0 >>548
イエエエ!
イエエエ!
554デフォルトの名無しさん (ワッチョイ ee8c-+zMD)
2020/07/16(木) 09:34:53.50ID:+sr/NO6P0 >>548
アイドルぷりぷり
アイドルぷりぷり
555デフォルトの名無しさん (ワッチョイ daad-YsWi)
2020/07/16(木) 22:21:03.87ID:HOuHYCld0 東京が goto キャンペーンから外されて本当に良かった。
>>555
goto hell キャンペーン?
goto hell キャンペーン?
557デフォルトの名無しさん (ワッチョイ daad-YsWi)
2020/07/16(木) 23:23:34.12ID:HOuHYCld0 東京以外は goto を使ったCプログラムで溢れかえるんだろうなあ・・・
558デフォルトの名無しさん (ワッチョイ 6d63-zSg9)
2020/07/16(木) 23:59:23.84ID:miG5Ngn20 すべてのreturnは東京に帰る
559デフォルトの名無しさん (アウアウエー Sa02-rGUB)
2020/07/17(金) 00:08:23.19ID:UXHw+Bbza exit((int) "TOKYO");
560デフォルトの名無しさん (ワッチョイ 5a0e-YsWi)
2020/07/17(金) 06:35:08.70ID:FmIaoXoT0 令和のgoto有害説
561デフォルトの名無しさん (ワッチョイ 752d-sTnA)
2020/07/17(金) 08:41:43.61ID:UlzyaY8x0 gotoとラベル
562デフォルトの名無しさん (スップ Sdda-BbQx)
2020/07/17(金) 09:09:08.77ID:+XePIYq+d うまいな
563デフォルトの名無しさん (アウアウウー Sa39-lbAa)
2020/07/17(金) 20:54:53.28ID:TuO7NpMNa くっ。やられた。
私の負けを認めよう。
私の負けを認めよう。
564デフォルトの名無しさん (ワッチョイ c628-UH/d)
2020/07/18(土) 12:46:51.82ID:PyiwbgQS0 奥村先生が書いてらっしゃる
「いまさらC言語」
https://scrapbox.io/imasaraC/
って、「初学者がC言語を学ぶ」という目的にはそぐいますか?
偉そうな言い方なんですけど、C言語の基礎を一通りなぞる感じには見えませんでした。
ですが、もしもC言語の基礎をこの記事で勉強できるなら、
奥村先生直筆の日本語文書ですし、ぜひ参考にさせていただきたいのです。
「いまさらC言語」
https://scrapbox.io/imasaraC/
って、「初学者がC言語を学ぶ」という目的にはそぐいますか?
偉そうな言い方なんですけど、C言語の基礎を一通りなぞる感じには見えませんでした。
ですが、もしもC言語の基礎をこの記事で勉強できるなら、
奥村先生直筆の日本語文書ですし、ぜひ参考にさせていただきたいのです。
565デフォルトの名無しさん (アウウィフ FF39-L8bc)
2020/07/18(土) 12:56:27.17ID:uRU3MGLxF 散文っぽくて体系的じゃない感じは受けた
「いまさら」であって「初めての」ではないので文字通り受け取って
既に知ってる人が改めて見直す機会には良いんじゃね
scanf
https://scrapbox.io/imasaraC/scanf()
fgets
https://scrapbox.io/imasaraC/fgets()
「いまさら」であって「初めての」ではないので文字通り受け取って
既に知ってる人が改めて見直す機会には良いんじゃね
scanf
https://scrapbox.io/imasaraC/scanf()
fgets
https://scrapbox.io/imasaraC/fgets()
566デフォルトの名無しさん (ワッチョイ c628-UH/d)
2020/07/18(土) 15:06:19.54ID:PyiwbgQS0567デフォルトの名無しさん (ワッチョイ ee8c-G2ah)
2020/07/21(火) 00:25:21.83ID:Wl7zo7XN0 すっごいポンコツPCでmacでCSV作って作ったの読み込んで計算して表示してって10回ぐらい繰り返したら同じデータ表示されるの?
568デフォルトの名無しさん (ブーイモ MMa1-cWPK)
2020/07/21(火) 00:30:45.40ID:Y7gEkUNqM ポンコツだとたまに計算間違うから無理じゃないかなあ
569蟻人間 ◆T6xkBnTXz7B0 (スフッ Sdfa-ch6b)
2020/07/21(火) 00:32:52.06ID:iLwMnecKd >>567
本当にポンコツであれば、主メモリーかHDDが壊れている可能性がある。
本当にポンコツであれば、主メモリーかHDDが壊れている可能性がある。
570デフォルトの名無しさん (ワッチョイ ee8c-G2ah)
2020/07/21(火) 00:34:45.78ID:Wl7zo7XN0 >>567
なんかこんな環境でやったらCSVのデータが更新されなくて10回全部同じ計算になってるって事が起きたから
やった人はsleepで遅らせたら変化したって言ってたからそんなことが起きる事があるのかって不思議に思ったわ
なんかこんな環境でやったらCSVのデータが更新されなくて10回全部同じ計算になってるって事が起きたから
やった人はsleepで遅らせたら変化したって言ってたからそんなことが起きる事があるのかって不思議に思ったわ
571はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 693e-hHzd)
2020/07/21(火) 01:27:00.90ID:VthsC7AN0 メモリは思ったより信用できない (ちょいちょい化ける) という話を
何かのウェブブラウザ関連の文章で読んだことがあるような
気がするんだけど思い出せない。
何かのウェブブラウザ関連の文章で読んだことがあるような
気がするんだけど思い出せない。
572デフォルトの名無しさん (ワッチョイ 6d63-zSg9)
2020/07/21(火) 01:41:36.17ID:bmKYQrdR0 おじいちゃん
573デフォルトの名無しさん (ワッチョイ 7663-GoP2)
2020/07/21(火) 02:56:31.73ID:i26SyfyA0 簡単に化けるから誤り検出符号なるものが存在している
HDDはもちろんメモリだって物理的に劣化する
HDDはもちろんメモリだって物理的に劣化する
574デフォルトの名無しさん (ラクッペペ MM0e-M824)
2020/07/21(火) 03:18:48.82ID:e/mkPZH8M575デフォルトの名無しさん (ワントンキン MMea-rqus)
2020/07/21(火) 03:19:15.76ID:z3AOQZxtM ディスクキャッシュでなかったかな。
毎度syncするようなkernelパラメータか何かを与えないと旧データを読み出すような事象が昔あったような。
毎度syncするようなkernelパラメータか何かを与えないと旧データを読み出すような事象が昔あったような。
576デフォルトの名無しさん (ワッチョイ 5a0e-YsWi)
2020/07/21(火) 08:19:11.51ID:6CpMqD4P0577デフォルトの名無しさん (オッペケ Sr75-J55X)
2020/07/21(火) 17:26:30.39ID:TSoseUQ7r C言語を3ヶ月前から勉強し始めたものです。この間、C言語3級を受験しました。
C言語かなり難しいです。
苦労しながらC言語学んだ方いますか?
C言語かなり難しいです。
苦労しながらC言語学んだ方いますか?
578デフォルトの名無しさん (ワッチョイ 69bb-zSg9)
2020/07/21(火) 17:28:45.77ID:aESJfhai0 はい
なんでしょう
なんでしょう
579デフォルトの名無しさん (オッペケ Sr75-J55X)
2020/07/21(火) 17:30:55.73ID:TSoseUQ7r 安心しました
がんばります
がんばります
580デフォルトの名無しさん (ワッチョイ 5a0e-YsWi)
2020/07/21(火) 17:30:56.37ID:6CpMqD4P0 苦労せずに学んだやつなんているのか?
元々アセンブラ屋でアドレスやポインタが当たり前だった俺でさえ
それなりに脂汗かきながら憶えたぞ
元々アセンブラ屋でアドレスやポインタが当たり前だった俺でさえ
それなりに脂汗かきながら憶えたぞ
581デフォルトの名無しさん (ワッチョイ 95ca-ebQW)
2020/07/21(火) 18:13:57.71ID:zwiBtbEn0 独学で始めたからリンカの使い方とかよく分からず、C のソースを全部 include してたな。
582デフォルトの名無しさん (ワッチョイ 7646-NUPd)
2020/07/21(火) 19:46:32.95ID:tvr2GUf40 >>581
nanisore. 面白い。詳しく。
nanisore. 面白い。詳しく。
583デフォルトの名無しさん (ワッチョイ 6d63-zSg9)
2020/07/21(火) 20:00:00.53ID:bmKYQrdR0 多分分割コンパイルのやり方を知らなかった頃の話だろう
584デフォルトの名無しさん (ワッチョイ 95ca-ebQW)
2020/07/21(火) 20:10:11.93ID:zwiBtbEn0585デフォルトの名無しさん (アウアウエー Sa02-rGUB)
2020/07/21(火) 22:42:16.68ID:nbzaQebba 依存ファイル集める方がよほど知識が要りそう
586デフォルトの名無しさん (ワッチョイ 1394-keh3)
2020/07/22(水) 15:51:53.55ID:xRlBM5RB0 このコード最適化の余地ある?-O3でやっても1900msとかかかるんだけど
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
int f(int size, int *data1, int *data2) {
int r = 0;
for (int j = 0; j < 100; j++) {
for (int i = 0; i < size; i++) {
r ^= data1[i] & data2[i];
}
}
return r;
}
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
int f(int size, int *data1, int *data2) {
int r = 0;
for (int j = 0; j < 100; j++) {
for (int i = 0; i < size; i++) {
r ^= data1[i] & data2[i];
}
}
return r;
}
587デフォルトの名無しさん (ワッチョイ 1394-keh3)
2020/07/22(水) 15:52:29.23ID:xRlBM5RB0 int main(int argc, char *argv[]) {
int size = 1000 * 1000 * 100;
int *data1 = (int*) malloc(size * sizeof(int));
int *data2 = (int*) malloc(size * sizeof(int));
//setup test data
srand((int) time(NULL));
for (int i = 0; i < size; i++) {
data1[i] = rand();
data2[i] = rand();
}
int sec, millisec;
struct timeb timebuffer;
//start
ftime(&timebuffer);
sec = timebuffer.time;
millisec = timebuffer.millitm;
int size = 1000 * 1000 * 100;
int *data1 = (int*) malloc(size * sizeof(int));
int *data2 = (int*) malloc(size * sizeof(int));
//setup test data
srand((int) time(NULL));
for (int i = 0; i < size; i++) {
data1[i] = rand();
data2[i] = rand();
}
int sec, millisec;
struct timeb timebuffer;
//start
ftime(&timebuffer);
sec = timebuffer.time;
millisec = timebuffer.millitm;
588デフォルトの名無しさん (ワッチョイ 1394-keh3)
2020/07/22(水) 15:52:35.64ID:xRlBM5RB0 // benchmark
int r = f(size, data1, data2);
// end
ftime(&timebuffer);
sec = timebuffer.time - sec;
millisec = timebuffer.millitm - millisec;
millisec += sec * 1000;
printf("%d ms \n %d", millisec, r);
free(data1);
free(data2);
}
int r = f(size, data1, data2);
// end
ftime(&timebuffer);
sec = timebuffer.time - sec;
millisec = timebuffer.millitm - millisec;
millisec += sec * 1000;
printf("%d ms \n %d", millisec, r);
free(data1);
free(data2);
}
589デフォルトの名無しさん (JP 0H55-ZQKC)
2020/07/22(水) 16:01:48.88ID:lGyqioywH f()で0返せばいいんじゃね?
590デフォルトの名無しさん (ワッチョイ 1394-keh3)
2020/07/22(水) 16:06:36.57ID:xRlBM5RB0 たしかにrが0になるが
たぶんsrand, randで値の分布が一様じゃないせいか?
Javaとの性能比較してたんだけど乱数生成法が合わせれないな
たぶんsrand, randで値の分布が一様じゃないせいか?
Javaとの性能比較してたんだけど乱数生成法が合わせれないな
591デフォルトの名無しさん (ワッチョイ 1394-keh3)
2020/07/22(水) 16:07:57.00ID:xRlBM5RB0 あ違うなsizeがでかすぎると0になっちゃうのか
592デフォルトの名無しさん (ワッチョイ 69e6-5TCi)
2020/07/22(水) 16:11:34.79ID:1buRSft90 Java(VM)とCという言語の比較をしたいのかこのソースを最適化したいのかrandの仕様を統一したいのか意味不明だわ
593デフォルトの名無しさん (ワッチョイ 1394-keh3)
2020/07/22(水) 16:21:46.25ID:xRlBM5RB0 JavaとCの性能比較で「Javaは高速だCに負けてない」とか
「JITやGCが動作する時に遅くなるだけだ」とか良く言われてる。
でもこういう単純な配列処理でCの方が3倍くらい速いよな、と思って。
この処理は計測中にヒープ割当が無いからGC関係ない(Javaでオブジェクトを作成するとGCのためのオーバーヘッドがあるらしい)。
JavaでJIT効かせてから計測してもCが4倍弱速かった。
最初1900msもかかるといってたのは勘違い。Cの方が4倍弱速いから予想通りの性能だった。
Javaの性能に関する言説を見渡しても、なぜこういう処理でJavaが遅いのか説明が無い。
大量のデータを処理しつつ特定の値に収束しない良いベンチマークコードがあればいいんだが。
足す引きを交互に繰り返すか。
「JITやGCが動作する時に遅くなるだけだ」とか良く言われてる。
でもこういう単純な配列処理でCの方が3倍くらい速いよな、と思って。
この処理は計測中にヒープ割当が無いからGC関係ない(Javaでオブジェクトを作成するとGCのためのオーバーヘッドがあるらしい)。
JavaでJIT効かせてから計測してもCが4倍弱速かった。
最初1900msもかかるといってたのは勘違い。Cの方が4倍弱速いから予想通りの性能だった。
Javaの性能に関する言説を見渡しても、なぜこういう処理でJavaが遅いのか説明が無い。
大量のデータを処理しつつ特定の値に収束しない良いベンチマークコードがあればいいんだが。
足す引きを交互に繰り返すか。
594デフォルトの名無しさん (ワッチョイ 1301-KHfa)
2020/07/22(水) 16:24:26.21ID:t6q0HDDX0 >>586
data1[i] & data2[i] の計算を100回もやることはないから
int f(int size, int *data1, int *data2) {
int *data3 = (int*) malloc(size * sizeof(int));
for (int i = 0; i < size; i++) {
data3[i] = data1[i] & data2[i];
}
int r = 0;
for (int j = 0; j < 100; j++) {
for (int i = 0; i < size; i++) {
r ^= data3[i];
}
}
free(data3);
return r;
}
ってやると多少速くなるかも
あとは分割してスレッドで並行して実行するとかかな
data1[i] & data2[i] の計算を100回もやることはないから
int f(int size, int *data1, int *data2) {
int *data3 = (int*) malloc(size * sizeof(int));
for (int i = 0; i < size; i++) {
data3[i] = data1[i] & data2[i];
}
int r = 0;
for (int j = 0; j < 100; j++) {
for (int i = 0; i < size; i++) {
r ^= data3[i];
}
}
free(data3);
return r;
}
ってやると多少速くなるかも
あとは分割してスレッドで並行して実行するとかかな
595デフォルトの名無しさん (ワッチョイ 1394-keh3)
2020/07/22(水) 16:26:57.20ID:xRlBM5RB0 これで収束しないし毎回ランダムな結果になる。
long f(int size, int *data1, int *data2) {
long r = 0;
for (int j = 0; j < 100; j++) {
for (int i = 0; i < size; i++) {
r += data1[i] - data2[i];//ここ変えた
}
}
return r;
}
long f(int size, int *data1, int *data2) {
long r = 0;
for (int j = 0; j < 100; j++) {
for (int i = 0; i < size; i++) {
r += data1[i] - data2[i];//ここ変えた
}
}
return r;
}
596デフォルトの名無しさん (JP 0H55-ZQKC)
2020/07/22(水) 16:34:17.16ID:lGyqioywH なんだ、^ の意味わかってなかったのか。
ていうか、コードの最適化を求めるなら、
そのコードの目的のほうが先に存在するはずじゃないのか?
コロコロ変えてさあ最適化しろとかおかしいだろ。
ていうか、コードの最適化を求めるなら、
そのコードの目的のほうが先に存在するはずじゃないのか?
コロコロ変えてさあ最適化しろとかおかしいだろ。
597デフォルトの名無しさん (ワッチョイ 1394-keh3)
2020/07/22(水) 16:39:25.22ID:xRlBM5RB0 0になってたのは^じゃなくて&が原因だろ
598デフォルトの名無しさん (JP 0H55-ZQKC)
2020/07/22(水) 16:42:01.87ID:lGyqioywH ^ だよ
最後のやつで + を ^ にしたらどうなる?
最後のやつで + を ^ にしたらどうなる?
599デフォルトの名無しさん (ワッチョイ 1394-keh3)
2020/07/22(水) 16:44:20.78ID:xRlBM5RB0 あr=0でr^=使ってたからか
演算子の意味じゃなくてr=0で始めてる事との整合性に気付いてなかった
r = rand();
r ^= data1[i] ^ data2[i]
これなら収束しないはず
演算子の意味じゃなくてr=0で始めてる事との整合性に気付いてなかった
r = rand();
r ^= data1[i] ^ data2[i]
これなら収束しないはず
600デフォルトの名無しさん (JP 0H55-ZQKC)
2020/07/22(水) 16:46:16.22ID:lGyqioywH それ、最初の rand の値が返るだけだから。
601デフォルトの名無しさん (エムゾネ FF33-keh3)
2020/07/22(水) 16:56:43.54ID:J+LKPgcIF もしかして残念なベンチ
602デフォルトの名無しさん (JP 0H55-ZQKC)
2020/07/22(水) 17:05:53.92ID:lGyqioywH 目的の明確でないベンチマーク作っても無駄だよね。
何を調べたいの?
何を調べたいの?
603デフォルトの名無しさん (ワッチョイ 69e6-5TCi)
2020/07/22(水) 17:19:08.68ID:1buRSft90 > この処理は計測中にヒープ割当が無い
って書いてあるけどガッツリ malloc してるし本当に何がしたいのか良く分からない
って書いてあるけどガッツリ malloc してるし本当に何がしたいのか良く分からない
604デフォルトの名無しさん (スププ Sd33-Y9Vl)
2020/07/22(水) 17:34:24.16ID:Y73iWKLTd 全ての値を偶数回^すれば答えは0になって当然
605デフォルトの名無しさん (ワッチョイ 1394-keh3)
2020/07/22(水) 17:58:11.98ID:xRlBM5RB0606デフォルトの名無しさん (スップ Sd73-Ky2H)
2020/07/22(水) 17:59:58.58ID:HrEyCXiAd >>586
大いに改善の余地あり
0になることを仮定せずに真面目に計算するとして
データがメモリがキャッシュに入るとすると
計算の依存関係ありまくりだから
ほぼレイテンシ待ちになる
ループ4周を展開して
rを4個に分けるだけで速くなりそう
SIMD命令が使えるなら
非常に効果がある形なので
使えるなら使う
この場合も演算の依存関係は減らすこと
データがキャッシュに収まらないなら
メモリ速度で決まるからあまり関係ない
大いに改善の余地あり
0になることを仮定せずに真面目に計算するとして
データがメモリがキャッシュに入るとすると
計算の依存関係ありまくりだから
ほぼレイテンシ待ちになる
ループ4周を展開して
rを4個に分けるだけで速くなりそう
SIMD命令が使えるなら
非常に効果がある形なので
使えるなら使う
この場合も演算の依存関係は減らすこと
データがキャッシュに収まらないなら
メモリ速度で決まるからあまり関係ない
607デフォルトの名無しさん (ワッチョイ 1394-keh3)
2020/07/22(水) 18:03:43.69ID:xRlBM5RB0 代入されないんじゃなくて偶数回^すると元に戻るのか
608デフォルトの名無しさん (ブーイモ MM4d-ZQKC)
2020/07/22(水) 18:04:59.81ID:YNla03BQM609デフォルトの名無しさん (ワッチョイ 1394-keh3)
2020/07/22(水) 18:09:25.81ID:xRlBM5RB0610デフォルトの名無しさん (ワッチョイ 1394-keh3)
2020/07/22(水) 18:12:28.77ID:xRlBM5RB0 あーじゃあr=0で始めてたことは関係無くて、
単に二重ループの外側が偶数回だと無意味だと。
r=0で始めてもXORならちゃんとビット列変わってたけどXORの性質から元に戻ってたと。
コンパイラがそれ知ってたら最適化して処理消しちゃうから良くないな。
XORのその性質を知らなかった
単に二重ループの外側が偶数回だと無意味だと。
r=0で始めてもXORならちゃんとビット列変わってたけどXORの性質から元に戻ってたと。
コンパイラがそれ知ってたら最適化して処理消しちゃうから良くないな。
XORのその性質を知らなかった
611デフォルトの名無しさん (ワッチョイ 1394-keh3)
2020/07/22(水) 18:26:49.94ID:xRlBM5RB0 より正しく述べておこう
・1回でも101回でも同じ結果なのでXOR版では二重ループの外側が無意味
・data1, data2がどんな数列でもXORの性質は同様にある
ID:lGyqioywHとID:YNla03BQMはこれを言ってたんだな
・1回でも101回でも同じ結果なのでXOR版では二重ループの外側が無意味
・data1, data2がどんな数列でもXORの性質は同様にある
ID:lGyqioywHとID:YNla03BQMはこれを言ってたんだな
612デフォルトの名無しさん (ワッチョイ 1394-keh3)
2020/07/22(水) 18:26:50.13ID:xRlBM5RB0 より正しく述べておこう
・1回でも101回でも同じ結果なのでXOR版では二重ループの外側が無意味
・data1, data2がどんな数列でもXORの性質は同様にある
ID:lGyqioywHとID:YNla03BQMはこれを言ってたんだな
・1回でも101回でも同じ結果なのでXOR版では二重ループの外側が無意味
・data1, data2がどんな数列でもXORの性質は同様にある
ID:lGyqioywHとID:YNla03BQMはこれを言ってたんだな
613デフォルトの名無しさん (ブーイモ MM4d-ZQKC)
2020/07/22(水) 19:03:36.52ID:YNla03BQM かようにベンチマークっていうのは難しいんだ。
CPUの比較をするだけでもいろんな提案があって
SPECとかはなんとか信頼されているが、
言語間の性能比較とか素人が適当にでっち上げても、
そのプログラムが悪いだけじゃねってなるのがオチ。
CPUの比較をするだけでもいろんな提案があって
SPECとかはなんとか信頼されているが、
言語間の性能比較とか素人が適当にでっち上げても、
そのプログラムが悪いだけじゃねってなるのがオチ。
614デフォルトの名無しさん (ワッチョイ d9ca-13t9)
2020/07/22(水) 21:28:34.34ID:EzFbgF7R0 最終的に 0 になるだろけど、この計算は愚直に行われるんでしょ。
答えが 0 にしかならないことと C と Java の速度差がそうなることとはまた別の話だよね。
って、コードの最適化の話だったんだっけ?
答えが 0 にしかならないことと C と Java の速度差がそうなることとはまた別の話だよね。
って、コードの最適化の話だったんだっけ?
615デフォルトの名無しさん (ワッチョイ 1394-keh3)
2020/07/22(水) 22:22:42.43ID:xRlBM5RB0 Cがこの処理でJavaより3〜4倍速い事は確認できた。
0に収束する事とそれは無関係。
以下、一応書くけど完全にスレ違い。
このような単純な配列処理でCとJavaの速度差がなぜ生じるか?はまだ分かってない。
・HotSpotは配列の境界チェックを除去できる
・一般論としてJavaが遅くなる原因としてJITやGCが挙げられるがこの単純なプログラムではそれらの影響はない
予想
・1命令で処理できるサイズが違っている?約4倍の速度差はベクトル演算の差で説明できそう。
だとしたらなぜJavaのJITはそれをやらないか?
・CPUキャッシュの問題?Javaの場合CPUキャッシュが別の何かで埋まってしまっている可能性
0に収束する事とそれは無関係。
以下、一応書くけど完全にスレ違い。
このような単純な配列処理でCとJavaの速度差がなぜ生じるか?はまだ分かってない。
・HotSpotは配列の境界チェックを除去できる
・一般論としてJavaが遅くなる原因としてJITやGCが挙げられるがこの単純なプログラムではそれらの影響はない
予想
・1命令で処理できるサイズが違っている?約4倍の速度差はベクトル演算の差で説明できそう。
だとしたらなぜJavaのJITはそれをやらないか?
・CPUキャッシュの問題?Javaの場合CPUキャッシュが別の何かで埋まってしまっている可能性
616デフォルトの名無しさん (ワッチョイ 69e6-A04g)
2020/07/22(水) 22:30:57.82ID:1buRSft90 自分のブログでやって
617デフォルトの名無しさん (ワッチョイ d9c3-Y9Vl)
2020/07/22(水) 23:08:24.67ID:G9I2XdZp0 そもそもjavaがc/c++並に速いとか、かなり嘘や誤魔化し入っているから
速度差3-4倍で済むなら十分健闘している
javaのコードを移植して、無駄にmalloc freeしまくったりする糞コードならもっと迫れるだろうけど
速度差3-4倍で済むなら十分健闘している
javaのコードを移植して、無駄にmalloc freeしまくったりする糞コードならもっと迫れるだろうけど
618デフォルトの名無しさん (ワッチョイ 3997-nH3A)
2020/07/23(木) 02:25:27.91ID:tfGyNQFW0619デフォルトの名無しさん (ガラプー KK4d-XNsZ)
2020/07/23(木) 04:09:18.13ID:NaEhWCW1K 最初の>>586の問いがベンチマークを意図してるとは思われてなかったから{return 0;}で良いんじゃね?ってなったんでは
620デフォルトの名無しさん (ワッチョイ d9ca-13t9)
2020/07/23(木) 11:21:03.05ID:TTqTgaIL0 javaの配列は特別な宣言無しに別スレッドでこっそり書き換えてもちゃんと反映されるわけだから、単純処理であっても最適化にも限界があるだろうな。
Cの場合は、他で書き換えられるかもと指定しておかなければ他所のことなんておかまいなしに処理できるから、その点だけでも有利だよね。
>>586 のコードのなら、i のループに入る前に data[j] を変数に取り置いて i のループ内で使用するようにすれば、java の方では高速化されるんじゃね。
C ならそれをコンパイラがやってくれてそう。
Cの場合は、他で書き換えられるかもと指定しておかなければ他所のことなんておかまいなしに処理できるから、その点だけでも有利だよね。
>>586 のコードのなら、i のループに入る前に data[j] を変数に取り置いて i のループ内で使用するようにすれば、java の方では高速化されるんじゃね。
C ならそれをコンパイラがやってくれてそう。
621デフォルトの名無しさん (ワッチョイ d9ca-13t9)
2020/07/23(木) 11:24:21.68ID:TTqTgaIL0 逆にCの側で配列を volatile にしておけば Java との速度差は小さくなるかもね。
622デフォルトの名無しさん (スップ Sd73-Ky2H)
2020/07/23(木) 11:26:24.50ID:V2V2cZYad data[j]なんかないけど
623デフォルトの名無しさん (ブーイモ MM9d-C2Yk)
2020/07/23(木) 11:46:46.14ID:vtZyy6ICM じゃあjava.util.concurrent.atomic以下にある配列クラスは全部廃止だな
624デフォルトの名無しさん (ワッチョイ 1394-keh3)
2020/07/23(木) 12:46:54.76ID:tYvDqilk0 ベクトル演算の未適用が原因だとほぼ特定できた。
625デフォルトの名無しさん (スップ Sd73-Ky2H)
2020/07/23(木) 13:17:22.41ID:V2V2cZYad626デフォルトの名無しさん (スップ Sd73-Ky2H)
2020/07/23(木) 13:19:58.21ID:V2V2cZYad 簡単な処理のために巨大メモリをスキャンするのは超無駄
627デフォルトの名無しさん (ワッチョイ 1394-keh3)
2020/07/23(木) 13:51:39.59ID:tYvDqilk0 C版
size
1000*1000 * 1 20ms
1000*1000 * 10 191ms
1000*1000 * 100 1893ms
線形な変化だからCPUキャッシュに載り切るかで性能が分かれるという事が生じてない。
たぶんCPUキャッシュは「繰り返し使うデータ」じゃないと有意義じゃない。
この処理だとCPUキャッシュ上のデータを排除可能になるまでの時間がボトルネックで、
つまり「CPU上のデータを処理しきって次の要素を受け付けれるようになるまでの時間」が支配的なはずで
そこがベクトル演算で高速化してる。
Java版も線形に変化した。
で、Javaのコードでr += data1[i] + data2[i]のところでdata1のみにしたら2倍速になったからベクトル演算未適用が原因でほぼ間違いない。
その行で+か-か^か&かは結論に影響しない。
size
1000*1000 * 1 20ms
1000*1000 * 10 191ms
1000*1000 * 100 1893ms
線形な変化だからCPUキャッシュに載り切るかで性能が分かれるという事が生じてない。
たぶんCPUキャッシュは「繰り返し使うデータ」じゃないと有意義じゃない。
この処理だとCPUキャッシュ上のデータを排除可能になるまでの時間がボトルネックで、
つまり「CPU上のデータを処理しきって次の要素を受け付けれるようになるまでの時間」が支配的なはずで
そこがベクトル演算で高速化してる。
Java版も線形に変化した。
で、Javaのコードでr += data1[i] + data2[i]のところでdata1のみにしたら2倍速になったからベクトル演算未適用が原因でほぼ間違いない。
その行で+か-か^か&かは結論に影響しない。
628デフォルトの名無しさん (ワッチョイ d9ca-13t9)
2020/07/23(木) 13:55:19.10ID:TTqTgaIL0629デフォルトの名無しさん (ワッチョイ d9ca-13t9)
2020/07/23(木) 14:11:44.83ID:TTqTgaIL0 >>623
値が volatile なことと操作が atomic なことは別の話だよ。
自分が書き換えない同じ領域を複数参照するとき、それを他の誰も書き換えないならその参照は一度目の値と同じになる前提で最適化できるけど、他の誰かがいつの間にか書き換えることがあるならそういう最適化はできなくなる。
そういう領域であることを明示するのが volatile。
atomic は同じ領域を誰かが書き換える前提なので基本的にその領域は volatile だけど、それに加えて値を参照して手を加えて書き戻すなどの一連の手続きの途中で他の誰かにいじられないことを保証すること。
それを CPUレベルの命令で行うかソフトウェア的なロックで行うかで色分けされてるだけ。
値が volatile なことと操作が atomic なことは別の話だよ。
自分が書き換えない同じ領域を複数参照するとき、それを他の誰も書き換えないならその参照は一度目の値と同じになる前提で最適化できるけど、他の誰かがいつの間にか書き換えることがあるならそういう最適化はできなくなる。
そういう領域であることを明示するのが volatile。
atomic は同じ領域を誰かが書き換える前提なので基本的にその領域は volatile だけど、それに加えて値を参照して手を加えて書き戻すなどの一連の手続きの途中で他の誰かにいじられないことを保証すること。
それを CPUレベルの命令で行うかソフトウェア的なロックで行うかで色分けされてるだけ。
630デフォルトの名無しさん (スップ Sd73-Ky2H)
2020/07/23(木) 14:28:36.26ID:V2V2cZYad >>627
CPUは何?
CPUは何?
631デフォルトの名無しさん (スップ Sd73-Ky2H)
2020/07/23(木) 14:33:33.27ID:V2V2cZYad メモリアクセスの影響がないなら
iとjのループを入れ換える
ループアンロール
rを偶数奇数で分ける
SIMD
などが有効
iとjのループを入れ換える
ループアンロール
rを偶数奇数で分ける
SIMD
などが有効
632デフォルトの名無しさん (スップ Sd73-Ky2H)
2020/07/23(木) 14:36:26.08ID:V2V2cZYad633デフォルトの名無しさん (ワッチョイ 1394-keh3)
2020/07/23(木) 14:42:55.39ID:tYvDqilk0634デフォルトの名無しさん (スップ Sd73-Ky2H)
2020/07/23(木) 14:44:16.58ID:V2V2cZYad CPUは何?
635デフォルトの名無しさん (ワッチョイ f97f-9CAQ)
2020/07/23(木) 16:21:21.26ID:WGvvEAFm0636デフォルトの名無しさん (ワッチョイ d9ca-13t9)
2020/07/23(木) 16:39:16.32ID:TTqTgaIL0 >>635
保証ってなんの話?
保証ってなんの話?
637デフォルトの名無しさん (ワッチョイ d901-1JrC)
2020/07/23(木) 20:41:12.28ID:j3eQi4Nn0638デフォルトの名無しさん (ワッチョイ 13ad-5TCi)
2020/07/24(金) 03:10:38.82ID:6ZonvnML0 volatile ってスレッドに限らず値が知らない内に変化する可能性のある何かの入力でも使うよね。
例えばマイクから拾った音を A/D 変換した値がメモリマップドI/Oで特定のアドレスのメモリ読む方法で読める場合。
CPUが予想不能な形で値がコロコロ変わるので volatile にせざるを得ない。(volatile って揮発性とか不安定って意味だし、言葉の意味そのままだ)。
これは読む側だけど書いて何かを出力する場合も、書いた値を読めないような作りになっている場合もある。
1を書いたのに直後に読むと0だったりなんていう事はあり得る。要するに一々覚えていない。または覚えていても読み出しに対応していない。
そんなハードウェアが接続されていたらそうなる。
例えばマイクから拾った音を A/D 変換した値がメモリマップドI/Oで特定のアドレスのメモリ読む方法で読める場合。
CPUが予想不能な形で値がコロコロ変わるので volatile にせざるを得ない。(volatile って揮発性とか不安定って意味だし、言葉の意味そのままだ)。
これは読む側だけど書いて何かを出力する場合も、書いた値を読めないような作りになっている場合もある。
1を書いたのに直後に読むと0だったりなんていう事はあり得る。要するに一々覚えていない。または覚えていても読み出しに対応していない。
そんなハードウェアが接続されていたらそうなる。
639デフォルトの名無しさん (ワッチョイ 812c-WQpp)
2020/07/24(金) 04:44:18.69ID:So4dssPK0 そりゃ、外部装置と連動しているから、値がいつ変わるか分からない
外部装置が読み書きしたら、合図として、0.1ms 後に、値を反転させたりとか、
色んな事をするから、予測できない
外部装置が読み書きしたら、合図として、0.1ms 後に、値を反転させたりとか、
色んな事をするから、予測できない
640デフォルトの名無しさん (ラクッペペ MMeb-Sn4z)
2020/07/24(金) 09:33:19.23ID:ASBY7bf4M volatileは変数(I/Oアドレス)に対するアクセス行為は保障するけど値そのものに対しては何の意味もない
そもそも外部要因で変化する値に対して干渉するのは不可能
そもそも外部要因で変化する値に対して干渉するのは不可能
641デフォルトの名無しさん (ワッチョイ 1301-KHfa)
2020/07/24(金) 10:20:02.92ID:4h264/iA0 どこから干渉するとか出てきたんだ…
知ってる知識を開陳したくてしょうがないんだろうなw
知ってる知識を開陳したくてしょうがないんだろうなw
642デフォルトの名無しさん (ワッチョイ d9da-u8K7)
2020/07/24(金) 15:22:34.69ID:jNVRIcub0 volatileな変数を読むのは怖いよね
ワード単位ならいいけど、構造体読むときはチェックサム欲しくなるよね
ワード単位ならいいけど、構造体読むときはチェックサム欲しくなるよね
643デフォルトの名無しさん (ワッチョイ d9ca-13t9)
2020/07/24(金) 18:25:04.01ID:ogZVfXfN0 別に怖くはないだろ。
他所と排他するなりしかるべきタイミングでアクセスすればいいだけなんだから。
排他や同期が必要な領域にそれをせずにアクセスするならただのアホってだけで、volatile がどうとかいう話じゃない。
他所と排他するなりしかるべきタイミングでアクセスすればいいだけなんだから。
排他や同期が必要な領域にそれをせずにアクセスするならただのアホってだけで、volatile がどうとかいう話じゃない。
644デフォルトの名無しさん (ワッチョイ 71b3-Ky2H)
2020/07/24(金) 20:10:16.16ID:Cmq7VG8v0 LL/SC命令が結構使える
645デフォルトの名無しさん (ワッチョイ 130e-5TCi)
2020/07/25(土) 04:21:09.10ID:qNFJliza0646デフォルトの名無しさん (ワッチョイ d901-fOmF)
2020/07/26(日) 03:07:46.88ID:4oXiyEBn0 「書きこんだものの読み込んでないからコードから消しちまえ」
「読み込んでるけど、代入以降値がかわる気配がないから、読み込みを止めて固定値にしちまえ」
これを抑制するだけ
書き込や読み込みを記述通り生き残らせる
「読み込んでるけど、代入以降値がかわる気配がないから、読み込みを止めて固定値にしちまえ」
これを抑制するだけ
書き込や読み込みを記述通り生き残らせる
647デフォルトの名無しさん (ワッチョイ 71b3-Ky2H)
2020/07/26(日) 08:34:28.91ID:M65fvK3w0 W=>R : R省略
R1=>R2 : R2省略
W1=>W2 : W1省略
R1=>R2 : R2省略
W1=>W2 : W1省略
648デフォルトの名無しさん (ワッチョイ 1301-KHfa)
2020/07/26(日) 10:41:35.23ID:3q3cv3BJ0 volatile覚えて嬉しいのはわかるけど…
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 高市首相の答弁書に「台湾有事答えない」と明記 存立危機発言当時 ★2 [蚤の市★]
- 【ド軍】山本由伸、WBC出場を決断!ドジャースが本人の意向を尊重、佐々木朗希はチームが故障歴を懸念で不参加 [鉄チーズ烏★]
- 米大統領報道官「日本と強固な同盟維持、中国とも協力」 [少考さん★]
- JA全農が「新おこめ券」…来年9月末の有効期限を新設、必要経費のみ上乗せ ★2 [蚤の市★]
- ミス・ユニバース フィンランド代表の「つり目」写真が波紋… 本人釈明も批判やまず 協会謝罪「徹底的に検証」へ [冬月記者★]
- 【テレビ】粗品「THE W」バッサリ「おもんない、レベル低い」審査員就任で「日テレが“血の海”に…」 [湛然★]
- キ...キャ...キャ...キャン...
- 自衛隊員が民間人を刺殺した事件ってもはや個人の問題ではないじゃん
- Z世代ってこれ何かわからないってマジ?!
- 【悲報】女さん「ハローワークで仕事を探してる3-40代の中年男性いるでしょ。あれ何?」 [483447288]
- ( ・᷄ὢ・᷅ )おう
- ( ・᷄ὢ・᷅ )博士メロつき界隈
