C言語なら俺に聞け 155

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ 76ba-P5bm)
垢版 |
2020/05/10(日) 23:20:27.99ID:Z3WQBr9X0
!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
2020/07/12(日) 19:01:50.30ID:XR2tpNWXM
落ち着け、IOCCC知らんのか
529デフォルトの名無しさん (ワッチョイ ab7c-jFjK)
垢版 |
2020/07/12(日) 19:40:25.98ID:uGVzSaa20
昔観た砂嵐のもこんなんだったな
マクロ使ってたかどうかは覚えてないけど
いずれにしても中身に意味があるとは思えない
2020/07/12(日) 19:48:29.22ID:TX1mpKr60
地上波アナログ?
531デフォルトの名無しさん (ワッチョイ ab7c-jFjK)
垢版 |
2020/07/13(月) 09:07:37.15ID:+mCuetAH0
落ち着け、IOCCC知らんのか
2020/07/13(月) 11:02:55.12ID:wLJMlZf60
わざと解りにくく書いたコードだぞ
「ちゃんと動くプログラム」という制約のもとで
解りにくさを競っているんだよ
533デフォルトの名無しさん (アウアウエー Sa13-c9t6)
垢版 |
2020/07/13(月) 11:11:26.83ID:Q6XHo6fua
>>525
岩の中にテレポートしそうなあたりじゃないかな
2020/07/13(月) 12:02:49.97ID:JZTlaHWid
>>527
素人かよ
2020/07/13(月) 12:06:46.27ID:WBkWHxcTF
>>527 本人じゃないけど
成型ツールで戻せば良いとか言うレベルじゃなくて
マジックナンバー使いまくりの手動最適化コードとか
読み難くする以外のメリットなんにも無い時間の無駄
難読化ツールとかの話も関係無い
2020/07/13(月) 12:12:02.64ID:JZTlaHWid
人間が読む事を想定してないコード
なんていう発想は無いのか
2020/07/13(月) 12:18:07.92ID:wLJMlZf60
機械語がそうだね
2020/07/13(月) 12:20:50.91ID:HqaSJoay0
難読ソースコンテストってのがあるって25年前に聞いた。
539デフォルトの名無しさん (エムゾネ FF43-jFjK)
垢版 |
2020/07/13(月) 12:22:42.17ID:WBkWHxcTF
どんなネタでも餌にして生きていける人って別の意味で浦山
2020/07/13(月) 12:39:50.37ID:17o/9bhC0
って言うか >>1 でリンク張られてるサイト
C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/
の 20.36 が 国際難解Cコードコンテスト(IOCCC) の紹介ですよ。

まぁ知らなくても実用では少しも困らないネタ話だけどね。
541デフォルトの名無しさん (JP 0H93-4zP6)
垢版 |
2020/07/13(月) 13:06:29.12ID:UIoR1/02H
IT掲示板群 ttp://x0000.net/forum.aspx?id=15

学術の巨大掲示板群 - アルファ・ラボ ttp://x0000.net
数学 物理学 化学 生物学 天文学 地理地学
IT 電子 工学 言語学 国語 方言 など

simulationライブラリで純粋な関数式プログラミングをする
ttp://x0000.net/topic.aspx?id=3631-0
UIライブラリ (C#, 2D) を作ったよ
ttp://x0000.net/topic.aspx?id=3688-0
連続と離散を統一した!
ttp://x0000.net/topic.aspx?id=3709-0
4Dエンジン(画像有り)
ttp://x0000.net/topic.aspx?id=3677-0
matrixのライブラリ
ttp://x0000.net/topic.aspx?id=3711-0
ある強力なFor関数
ttp://x0000.net/topic.aspx?id=3630-0
SQLライブラリ
ttp://x0000.net/topic.aspx?id=3675-0

☆ VMを書いた(C#) * x86ではない!
ttp://up.x0000.net/files/TSimulang.zip
☆ malloc / free を実装してみた (C#)
ttp://up.x0000.net/files/TMallocTest.zip
542デフォルトの名無しさん (ワッチョイ 23ad-skOr)
垢版 |
2020/07/13(月) 23:11:58.86ID:9EBd4T6S0
>>540
読み方は?
2020/07/15(水) 14:29:54.86ID:U8iX10oDd
あいおーしーしーしー
2020/07/15(水) 15:00:37.70ID:67nW9VWC0
催し物やな
2020/07/15(水) 15:52:55.55ID:N3ltiDOr0
市民館みたいなとこでやってるわけじゃないがな
546デフォルトの名無しさん (ワッチョイ daad-0yBj)
垢版 |
2020/07/15(水) 20:44:36.96ID:pJ20MS8a0
CCCの部分はトリプルCではなく?
2020/07/15(水) 20:50:18.41ID:N3ltiDOr0
うん、トリプルって読み方する人には会ったことがないな
2020/07/15(水) 20:50:51.37ID:N3ltiDOr0
あいとりぷるいーは普通だけど
2020/07/15(水) 21:08:27.18ID:a3wypoikM
このクイズ番組の回答者が読み方喋ってる
https://youtu.be/f7WPP-5GG58
2020/07/15(水) 21:53:44.85ID:JGqdiMCl0
>>548
イエーー
が正しい
2020/07/16(木) 00:44:59.58ID:ZFOOaYp/a
>>546
カルチュアコンビニエンスクラブ
2020/07/16(木) 04:02:23.42ID:CYft8xDJ0
>>550
イェェェ!!
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 キャンペーンから外されて本当に良かった。
2020/07/16(木) 22:33:48.51ID:g74RUxa7H
>>555
goto hell キャンペーン?
557デフォルトの名無しさん (ワッチョイ daad-YsWi)
垢版 |
2020/07/16(木) 23:23:34.12ID:HOuHYCld0
東京以外は goto を使ったCプログラムで溢れかえるんだろうなあ・・・
2020/07/16(木) 23:59:23.84ID:miG5Ngn20
すべてのreturnは東京に帰る
2020/07/17(金) 00:08:23.19ID:UXHw+Bbza
exit((int) "TOKYO");
2020/07/17(金) 06:35:08.70ID:FmIaoXoT0
令和のgoto有害説
2020/07/17(金) 08:41:43.61ID:UlzyaY8x0
gotoとラベル
2020/07/17(金) 09:09:08.77ID:+XePIYq+d
うまいな
563デフォルトの名無しさん (アウアウウー Sa39-lbAa)
垢版 |
2020/07/17(金) 20:54:53.28ID:TuO7NpMNa
くっ。やられた。
私の負けを認めよう。
2020/07/18(土) 12:46:51.82ID:PyiwbgQS0
奥村先生が書いてらっしゃる
「いまさら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()
2020/07/18(土) 15:06:19.54ID:PyiwbgQS0
>>565
ありがとうございます。
入門書と銘打ってる文書にします。
567デフォルトの名無しさん (ワッチョイ ee8c-G2ah)
垢版 |
2020/07/21(火) 00:25:21.83ID:Wl7zo7XN0
すっごいポンコツPCでmacでCSV作って作ったの読み込んで計算して表示してって10回ぐらい繰り返したら同じデータ表示されるの?
2020/07/21(火) 00:30:45.40ID:Y7gEkUNqM
ポンコツだとたまに計算間違うから無理じゃないかなあ
2020/07/21(火) 00:32:52.06ID:iLwMnecKd
>>567
本当にポンコツであれば、主メモリーかHDDが壊れている可能性がある。
570デフォルトの名無しさん (ワッチョイ ee8c-G2ah)
垢版 |
2020/07/21(火) 00:34:45.78ID:Wl7zo7XN0
>>567
なんかこんな環境でやったらCSVのデータが更新されなくて10回全部同じ計算になってるって事が起きたから
やった人はsleepで遅らせたら変化したって言ってたからそんなことが起きる事があるのかって不思議に思ったわ
2020/07/21(火) 01:27:00.90ID:VthsC7AN0
メモリは思ったより信用できない (ちょいちょい化ける) という話を
何かのウェブブラウザ関連の文章で読んだことがあるような
気がするんだけど思い出せない。
2020/07/21(火) 01:41:36.17ID:bmKYQrdR0
おじいちゃん
2020/07/21(火) 02:56:31.73ID:i26SyfyA0
簡単に化けるから誤り検出符号なるものが存在している
HDDはもちろんメモリだって物理的に劣化する
2020/07/21(火) 03:18:48.82ID:e/mkPZH8M
https://ja.wikipedia.org/wiki/ECC%E3%83%A1%E3%83%A2%E3%83%AA
2020/07/21(火) 03:19:15.76ID:z3AOQZxtM
ディスクキャッシュでなかったかな。
毎度syncするようなkernelパラメータか何かを与えないと旧データを読み出すような事象が昔あったような。
2020/07/21(火) 08:19:11.51ID:6CpMqD4P0
>>571
DRAMのメモリセルに宇宙線が当たったりね
でサーバー用のメモリにはECCがついてるし
HDDはRAIDで耐障害性設計もする
2020/07/21(火) 17:26:30.39ID:TSoseUQ7r
C言語を3ヶ月前から勉強し始めたものです。この間、C言語3級を受験しました。

C言語かなり難しいです。

苦労しながらC言語学んだ方いますか?
2020/07/21(火) 17:28:45.77ID:aESJfhai0
はい
なんでしょう
2020/07/21(火) 17:30:55.73ID:TSoseUQ7r
安心しました
がんばります
2020/07/21(火) 17:30:56.37ID:6CpMqD4P0
苦労せずに学んだやつなんているのか?

元々アセンブラ屋でアドレスやポインタが当たり前だった俺でさえ
それなりに脂汗かきながら憶えたぞ
2020/07/21(火) 18:13:57.71ID:zwiBtbEn0
独学で始めたからリンカの使い方とかよく分からず、C のソースを全部 include してたな。
2020/07/21(火) 19:46:32.95ID:tvr2GUf40
>>581
nanisore. 面白い。詳しく。
2020/07/21(火) 20:00:00.53ID:bmKYQrdR0
多分分割コンパイルのやり方を知らなかった頃の話だろう
2020/07/21(火) 20:10:11.93ID:zwiBtbEn0
>>583
そそ、そういうこと。
んで複数のソースを include するだけのファイルを作って、それのことを makeファイルと言うんだと思ってた。
585デフォルトの名無しさん (アウアウエー 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;
}
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;
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);
}
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との性能比較してたんだけど乱数生成法が合わせれないな
591デフォルトの名無しさん (ワッチョイ 1394-keh3)
垢版 |
2020/07/22(水) 16:07:57.00ID:xRlBM5RB0
あ違うなsizeがでかすぎると0になっちゃうのか
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が遅いのか説明が無い。

大量のデータを処理しつつ特定の値に収束しない良いベンチマークコードがあればいいんだが。
足す引きを交互に繰り返すか。
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;
}
ってやると多少速くなるかも
あとは分割してスレッドで並行して実行するとかかな
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;
}
2020/07/22(水) 16:34:17.16ID:lGyqioywH
なんだ、^ の意味わかってなかったのか。
ていうか、コードの最適化を求めるなら、
そのコードの目的のほうが先に存在するはずじゃないのか?
コロコロ変えてさあ最適化しろとかおかしいだろ。
597デフォルトの名無しさん (ワッチョイ 1394-keh3)
垢版 |
2020/07/22(水) 16:39:25.22ID:xRlBM5RB0
0になってたのは^じゃなくて&が原因だろ
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]
これなら収束しないはず
2020/07/22(水) 16:46:16.22ID:lGyqioywH
それ、最初の rand の値が返るだけだから。
601デフォルトの名無しさん (エムゾネ FF33-keh3)
垢版 |
2020/07/22(水) 16:56:43.54ID:J+LKPgcIF
もしかして残念なベンチ
2020/07/22(水) 17:05:53.92ID:lGyqioywH
目的の明確でないベンチマーク作っても無駄だよね。
何を調べたいの?
2020/07/22(水) 17:19:08.68ID:1buRSft90
> この処理は計測中にヒープ割当が無い
って書いてあるけどガッツリ malloc してるし本当に何がしたいのか良く分からない
2020/07/22(水) 17:34:24.16ID:Y73iWKLTd
全ての値を偶数回^すれば答えは0になって当然
605デフォルトの名無しさん (ワッチョイ 1394-keh3)
垢版 |
2020/07/22(水) 17:58:11.98ID:xRlBM5RB0
>>600
なんで代入されないんだ?

>>602
>>593
>こういう単純な配列処理でCの方が3倍くらい速い

>>603
「計測中に」はstartとendの間にという意味。
2020/07/22(水) 17:59:58.58ID:HrEyCXiAd
>>586
大いに改善の余地あり
0になることを仮定せずに真面目に計算するとして

データがメモリがキャッシュに入るとすると
計算の依存関係ありまくりだから
ほぼレイテンシ待ちになる

ループ4周を展開して
rを4個に分けるだけで速くなりそう

SIMD命令が使えるなら
非常に効果がある形なので
使えるなら使う
この場合も演算の依存関係は減らすこと

データがキャッシュに収まらないなら
メモリ速度で決まるからあまり関係ない
607デフォルトの名無しさん (ワッチョイ 1394-keh3)
垢版 |
2020/07/22(水) 18:03:43.69ID:xRlBM5RB0
代入されないんじゃなくて偶数回^すると元に戻るのか
2020/07/22(水) 18:04:59.81ID:YNla03BQM
>>605
> なんで代入されないんだ?

代入はされているが、100が偶数だから >>604 の言うように0に戻ってるだけ。
609デフォルトの名無しさん (ワッチョイ 1394-keh3)
垢版 |
2020/07/22(水) 18:09:25.81ID:xRlBM5RB0
二重ループにして外側が偶数回だからか。
「同じ乱数列を偶数回XOR走らせたら元に戻る」と。
>>600>>604が言ってるのはそういうことか

勉強になった
610デフォルトの名無しさん (ワッチョイ 1394-keh3)
垢版 |
2020/07/22(水) 18:12:28.77ID:xRlBM5RB0
あーじゃあr=0で始めてたことは関係無くて、
単に二重ループの外側が偶数回だと無意味だと。
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はこれを言ってたんだな
612デフォルトの名無しさん (ワッチョイ 1394-keh3)
垢版 |
2020/07/22(水) 18:26:50.13ID:xRlBM5RB0
より正しく述べておこう
・1回でも101回でも同じ結果なのでXOR版では二重ループの外側が無意味
・data1, data2がどんな数列でもXORの性質は同様にある

ID:lGyqioywHとID:YNla03BQMはこれを言ってたんだな
2020/07/22(水) 19:03:36.52ID:YNla03BQM
かようにベンチマークっていうのは難しいんだ。
CPUの比較をするだけでもいろんな提案があって
SPECとかはなんとか信頼されているが、
言語間の性能比較とか素人が適当にでっち上げても、
そのプログラムが悪いだけじゃねってなるのがオチ。
2020/07/22(水) 21:28:34.34ID:EzFbgF7R0
最終的に 0 になるだろけど、この計算は愚直に行われるんでしょ。
答えが 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キャッシュが別の何かで埋まってしまっている可能性
616デフォルトの名無しさん (ワッチョイ 69e6-A04g)
垢版 |
2020/07/22(水) 22:30:57.82ID:1buRSft90
自分のブログでやって
2020/07/22(水) 23:08:24.67ID:G9I2XdZp0
そもそもjavaがc/c++並に速いとか、かなり嘘や誤魔化し入っているから
速度差3-4倍で済むなら十分健闘している

javaのコードを移植して、無駄にmalloc freeしまくったりする糞コードならもっと迫れるだろうけど
2020/07/23(木) 02:25:27.91ID:tfGyNQFW0
>>615
そもそもJITが吐くバイナリを逆アセンブルして比較しなきゃしょうがないんでね?
そのようなことが可能かは知らないけど、処理中にデバッガで無理矢理止めればわかりそうな気はする
2020/07/23(木) 04:09:18.13ID:NaEhWCW1K
最初の>>586の問いがベンチマークを意図してるとは思われてなかったから{return 0;}で良いんじゃね?ってなったんでは
2020/07/23(木) 11:21:03.05ID:TTqTgaIL0
javaの配列は特別な宣言無しに別スレッドでこっそり書き換えてもちゃんと反映されるわけだから、単純処理であっても最適化にも限界があるだろうな。
Cの場合は、他で書き換えられるかもと指定しておかなければ他所のことなんておかまいなしに処理できるから、その点だけでも有利だよね。
>>586 のコードのなら、i のループに入る前に data[j] を変数に取り置いて i のループ内で使用するようにすれば、java の方では高速化されるんじゃね。
C ならそれをコンパイラがやってくれてそう。
2020/07/23(木) 11:24:21.68ID:TTqTgaIL0
逆にCの側で配列を volatile にしておけば Java との速度差は小さくなるかもね。
2020/07/23(木) 11:26:24.50ID:V2V2cZYad
data[j]なんかないけど
2020/07/23(木) 11:46:46.14ID:vtZyy6ICM
じゃあjava.util.concurrent.atomic以下にある配列クラスは全部廃止だな
624デフォルトの名無しさん (ワッチョイ 1394-keh3)
垢版 |
2020/07/23(木) 12:46:54.76ID:tYvDqilk0
ベクトル演算の未適用が原因だとほぼ特定できた。
2020/07/23(木) 13:17:22.41ID:V2V2cZYad
>>587
巨大サイズメモリで簡単な演算だから
ほとんどがメモリアクセス時間だろ
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倍速になったからベクトル演算未適用が原因でほぼ間違いない。
その行で+か-か^か&かは結論に影響しない。
2020/07/23(木) 13:55:19.10ID:TTqTgaIL0
>>622
ほんとだw
data1 か data2 かは置いといてもどっちも i を添字とするループか。
マトリクス状に組み合わせてるんだと錯覚してたすまん
■ このスレッドは過去ログ倉庫に格納されています