[過去ログ] C++相談室 part130 [無断転載禁止]©2ch.net (1002レス)
1-

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
633
(2): (ワッチョイ 6e1c-4/kT) 2017/07/05(水)15:44 ID:4h6UtxrL0(1) AAS
istream_iterator<int> first(cin), last;
vector<int> wish_of_632{first, last};
634: (スッップ Sd62-TIEP) 2017/07/05(水)16:39 ID:/9Xtn5yvd(2/2) AAS
>>633
試してみるサンクス
635: (オッペケ Sr71-F+4p) 2017/07/05(水)16:59 ID:UhWlQCq1r(1/3) AAS
Visual Studio 2017のリリースビルドで試したが>>633 の方法は倍ほど遅いような
636: 片山博文MZ ◆T6xkBnTXz7B0 (スフッ Sd62-3ntT) 2017/07/05(水)17:16 ID:2aUA7xnEd(1/5) AAS
fread, fgets, getchar
637
(1): 片山博文MZ ◆T6xkBnTXz7B0 (スフッ Sd62-3ntT) 2017/07/05(水)17:22 ID:2aUA7xnEd(2/5) AAS
int n = 0;
if ('0' <= ch && ch <= '9') {
n *= 10;
n += ch - '0';
} else {
put_int(n);
n = 0;
}
638: 片山博文MZ ◆T6xkBnTXz7B0 (スフッ Sd62-3ntT) 2017/07/05(水)17:31 ID:2aUA7xnEd(3/5) AAS
GetStdHandle(STD_INPUT_HANDLE)
639: (ワッチョイ c2f0-wjSU) 2017/07/05(水)18:03 ID:IVGCprss0(1) AAS
大量=一行10000個程度の数字が10000行ほど?
640
(1): (オッペケ Sr71-F+4p) 2017/07/05(水)18:09 ID:UhWlQCq1r(2/3) AAS
自前が最速なのだろうが汎用性を考えるとお勧めできない

ある環境での適当な100万個の整数読み込み時間:
 istream_iterator : 470ms
 scanf : 230ms
 fgetc+自前スペース解析+atoi :
175ms
 最初に全部char配列に読み込み+片山式パース: 32ms
641: (ワッチョイ 46e4-ejav) 2017/07/05(水)19:23 ID:rZavNuQl0(1) AAS
何のチェックもしないscanf,printfのやり方が最速なのは自明
642
(1): (ワッチョイ 6111-wjSU) 2017/07/05(水)20:06 ID:tZeoWZVY0(1/3) AAS
>>640
>最初に全部char配列に読み込み+片山式パース:

これって随分早いけどパースより読み込みが効いてるんじゃないの
恐らくfgets使ってるんだよね
643
(1): (オッペケ Sr71-F+4p) 2017/07/05(水)20:09 ID:UhWlQCq1r(3/3) AAS
>>642
fgetsでなくfreadで読んだ
なおこの全読み込み方式で数値の切り出しをatoiにすると80msだったので
やはりI/Oの効率化が支配的と理解した
644: (ワッチョイ 6111-wjSU) 2017/07/05(水)21:04 ID:tZeoWZVY0(2/3) AAS
>>643
てことは
fgetc+自前スペース解析+atoi :175ms
fread++自前スペース解析+atoi :80ms
読み込みのオーバーヘッドで175-80=95msロスしてるわけか

atoiは変換不能文字とか16進とかチェックしてるからその分遅くなるんだろう
自前で10進のみに特化させるのが一番なんだけどもな
645: (スップ Sdc2-Pf3w) 2017/07/05(水)21:05 ID:O+22iBefd(1/3) AAS
複数スレッドに分けてアセンブラの自作関数で回す
646: (スップ Sdc2-Pf3w) 2017/07/05(水)21:07 ID:O+22iBefd(2/3) AAS
各スレッドも、複数数値を並列で動かす
647: (スップ Sdc2-Pf3w) 2017/07/05(水)21:08 ID:O+22iBefd(3/3) AAS
C++スレだった
すまんこ
648: はつみつ餃子 ◆8X2XSCHEME (ワッチョイ 8215-CicO) 2017/07/05(水)21:23 ID:YH3wEyty0(1) AAS
どういう風に並列化できる?
649: 片山博文MZ ◆T6xkBnTXz7B0 (スフッ Sd62-3ntT) 2017/07/05(水)21:26 ID:2aUA7xnEd(4/5) AAS
処理すべきブロックに対して、ちょうどいい区切りで、等分割に近い分割をやって、それぞれを別々のスレッドで処理する。
スレッドがすべて終わったら、処理結果を結合する。
650: (ワッチョイ 6111-wjSU) 2017/07/05(水)21:28 ID:tZeoWZVY0(3/3) AAS
スレッドもインラインアセンブラもC++の範疇だよ
ただIOはロックされるから解放待ちの時間が出来てしまう

ラインごとに随時読み込んでスレッド振り分けかな
パースに時間がかかるならそれも悪くないんだろうけど簡易atoi程度じゃ差は出にくい
651: (ワッチョイ c21b-8PSv) 2017/07/05(水)21:34 ID:slEXI2jh0(1) AAS
原理的にはブロッキングIOのファイル読み出しの待ち時間を有効に活用すれば
それが最速だけど並列化のオーバーヘッドを最小にしようと思ったら
OS毎あるいはファイルIOのライブラリ毎に特化しなきゃならない気がするので面倒くさい
652: 片山博文MZ ◆T6xkBnTXz7B0 (スフッ Sd62-3ntT) 2017/07/05(水)21:40 ID:2aUA7xnEd(5/5) AAS
#ifdef _WIN32
// Windowsの場合
...
#elif ...
1-
あと 350 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.034s