- 1 名前:デフォルトの名無しさん [2008/02/27(水) 02:03:30 ]
- C++標準ライブラリの一つ、STLについて。
前スレ 【C++】STL(Standard Template Library)相談室 8 pc11.2ch.net/test/read.cgi/tech/1198435319/ 過去ログ・リンク・書籍紹介は >>2 以降
- 641 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 20:31:07 ]
- \n とか \r\n とかが入った文字列を SetDlgItemTextすると
char のときはちゃんと改行してるのに string だと改行されずに何も表示されないわけですが string って \n とかとは別に改行とかタブコードがあるんでしょうか?
- 642 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 20:40:55 ]
- 実際のコード貼ってみれ
- 643 名前:641 mailto:sage [2008/06/13(金) 21:37:36 ]
- あははははは!!!!!
エディットコントロールのマルチラインがFalseなだけだった 俺市ねw
- 644 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 22:13:13 ]
- 641は死んだの?
- 645 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 22:49:25 ]
- >>644
今日までの641は氏に、また一歩成長したプログラマーとして生まれ変わるのです。
- 646 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 12:34:34 ]
- >>645が良い事言った
- 647 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 15:25:44 ]
- フェニックスシングルトンなわけですね。
- 648 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 15:30:12 ]
- シングルトンを真面目に考えるとややこしい事限りないなあ。
- 649 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 15:31:25 ]
- 非常に優秀なデザインパターンの1つだと思うな
- 650 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 15:36:29 ]
- インスタンスの数が1個に限定される分、むしろ単純にならないか?
- 651 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 15:39:16 ]
- Modern C++ Design を読むと
シングルトンのややこしさがよく分かる。 Scala みたいに言語的にサポートしてくれればいいんだが。
- 652 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 15:48:11 ]
- 作るのはいいけど削除のタイミングが面倒くさいんだよね。
- 653 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 15:53:21 ]
- いつでもnewdelete出来るように改良した、って自慢げに変なシングルトン使いまくる奴ならいたな
- 654 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 15:58:26 ]
- deleteしたら自動的に新しいインスタンスが作られて、
newしたら自動的に今あるインスタンスが削除されるシングルトン
- 655 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 16:51:25 ]
- >言語的にサポート
使う人間のスキルへの依存度が高いC++に期待してはいけないものだよ。
- 656 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 16:59:25 ]
- シングルトンて心太に似てるよね
- 657 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 18:36:28 ]
- STLを軽く弄るためにこのスレを覗きにくるC++ビギナーはフェニックスシングルトンとModernC++Designをどうやって関連付けて考えるだろうか。
- 658 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 18:37:22 ]
- 「スレ違い」 と関連づけて考える事だろう
- 659 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 19:42:54 ]
- mapはどうやってfindなどで入力されたキーが木にあるキーと同じかどうかを見るんでしょうか?
比較関数ならstd::less<T>がデフォルトで入っていてこいつを使えば良いと分かるんですか、 これと同じ様に一致関数をテンプレート引数で指定できませんか?
- 660 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 19:45:23 ]
- 比較関数をltとすると、
!lt(x, y) && !lt(y, x) で一致判定してる
- 661 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 19:46:43 ]
- マップのキーは、その比較関数を使って一致を判断する
!(a < b) && !(b < a) なら a と b は一致していることになる
- 662 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 20:12:24 ]
- そして等価と等値の話が始まる。
- 663 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 22:07:44 ]
- 重要な概念だしな
- 664 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 09:53:59 ]
- そしてEffective STL が売れる
- 665 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 10:08:08 ]
- そして日本語版Modern C++ Designが叩かれる。
- 666 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 15:05:30 ]
- ListとかVectorってスレッドセーフですか?
複数のスレッドからイテレータ取得してアクセスしたりするなら シグナルやミューテクスでロックしてからアクセスするべきですか?
- 667 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 15:10:46 ]
- そうですね。
- 668 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 15:16:56 ]
- >>666
実装次第。 各処理系のマニュアルを読むよう。
- 669 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 15:29:14 ]
- STLportでぐぐらない方が良い。
- 670 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 20:02:10 ]
- スレッドセーフなのか?という問いに答える者はいなかったといふ
- 671 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 20:04:49 ]
- 実装次第だし。
- 672 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 20:09:48 ]
- スレッドセーフではない と一律で答えておいたほうが面倒がない
- 673 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 21:24:55 ]
- Camelなリストやベクタはスレチ。
- 674 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 21:43:27 ]
- というか、「スレッド」の概念が標準C++にあるんだっけ?
- 675 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 21:54:49 ]
- ございません
- 676 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 22:07:35 ]
- スレッドの概念が無いから「スレッドセーフでない」という概念も無い。
- 677 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 22:15:17 ]
- C++0xにご期待下さい
- 678 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 02:26:33 ]
- >>670 >>531-540
- 679 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 22:08:47 ]
- コンテナの範囲外にイテレータがインクメントされてしまってもコンテナを自動で拡張し、
あたかも未だに範囲内を指している様に振舞うイテレータってのがあると思うんですけど 実際はなくてただの思い過ごしだったりしますか?しなかった場合はそれが何なのか教えてください。
- 680 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 22:22:49 ]
- insert_iteratorのことを言ってるのかな。
- 681 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 22:35:13 ]
- 自己解決もしたし意味不明な書き込みなんてみんな無視してくれるだろうと思っていたら教えてくれている人が居た。
ありがとう。
- 682 名前:デフォルトの名無しさん [2008/06/20(金) 15:05:13 ]
- std::vector<std::string> v1;
みたいなインスタンスをシリアライズ化したいんですけど、単純に FILE *fp = fopen("vec.bin", "wb"); fwrite(&v1, sizeof(v1), 1, fp); fclose(fp); みたいに書き込めば良いんですかね? そして戻すときは、逆に std::vector<std::string> v1; char* buf = (char*)&v1; FILE *fp = fopen("vec.bin", "rb"); while(fread(buf++, 1, 1, fp) > 0); fclose(fp); みたいな感じでいいんですかね? STLのインスタンスのシリアライズ化で、もっと適切な方法があったら教えてください。
- 683 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 15:33:55 ]
- vectorの内部にはポインタも含まれるから
オブジェクトの性質を考えてPOD型のデータまで落としこまないとダメだろう
- 684 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 15:38:38 ]
- vectorの扱う型ががフリーストアを使ってないという保証があればあるいは
- 685 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 15:46:36 ]
- boost::serialization使うって手も <あまり使いやすくは無い
- 686 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 16:45:27 ]
- VS2005では一応下のコードは正常に動きました。
とりあえずこれが動けば十分です。 std::vector<std::string> v1; v1.clear(); v1.push_back("要素1"); v1.push_back("要素2"); v1.push_back("要素3"); FILE *fp; fopen_s(&fp, "vec.bin", "wb"); fwrite(&v1, sizeof(v1), 1, fp); fclose(fp); std::vector<std::string> v2; char* buf = (char*)&v2; fopen_s(&fp, "vec.bin", "rb"); while(fread(buf++, 1, 1, fp) > 0); fclose(fp);
- 687 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 16:53:25 ]
- >>686
まてまて、それv1の確保したメモリアドレスをv2が指しているだけだろ。 終了時に2重解放でエラーになってないか?
- 688 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 16:54:48 ]
- と思ったら、デストラクタで怒られました。
何がいけないんだろう・・・
- 689 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 16:58:00 ]
- 上の人も書いてるけどvectorは内部にポインタを持ってるんだってば。
(ついでにstringもな) fwriteでv1を直書きすると、ポインタのアドレスが保存されるだけで、 ポイント先は保存されないんだよ。
- 690 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 17:00:54 ]
- >>687,689
どうすればいいでしょうか。 やりたいことは、カンマ区切りで並んでいる大量の文字列データがあって、 それをカンマの区切りを探しつつ読み込むと非常に時間がかかるので、 初回だけカンマ区切りを解釈したら、その後はインスタンスをバイナリで一気に保存、一気に復元したいのです。
- 691 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 17:04:45 ]
- vector使わずに配列を使えばいいんでしょうが、vectorのデータをシリアライズ化するということは
ニーズとしてあるはずなので、そういう手法があれば教えていただきたいのです。 ただシリアライズのためにboostという別ライブラリを使用するのは、ちょっと大げさすぎかなと。。 そこまでするなら配列でやります。
- 692 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 17:10:08 ]
- 自分の力量・理解度に応じた実装をするべし
- 693 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 17:11:11 ]
- 最低限のデータを保存したい場合はこうじゃない?
std::vector<std::string> v1; v1.clear(); v1.push_back("要素1"); v1.push_back("要素2"); v1.push_back("要素3"); FILE *fp; fopen_s(&fp, "vec.bin", "wb"); const char *pstr; fwrite(&v1.size(), sizeof(size_t), 1, fp); //読み込むときの利便を考えて要素数を保存 for(size_t c=0, e=v1.size(); c < e; c++) { pstr = v1[c].c_str(); fwrite(pstr, strlen(pstr), 1, fp); } fclose(fp);
- 694 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 17:21:42 ]
- stringのサイズ保存してなかったので訂正
書き込み std::vector<std::string> v1; v1.clear(); v1.push_back("要素1"); v1.push_back("要素2"); v1.push_back("要素3"); FILE *fp; fopen_s(&fp, "vec.bin", "wb"); fwrite(&v1.size(), sizeof(size_t), 1, fp); //読み込むときの利便を考えて要素数を保存 size_t size; for(size_t c=0, e=v1.size(); c < e; c++) { size = v1[c].size(); fwite(&size, sizeof(size), 1, fp); fwrite(v1[c].c_str(), size, 1, fp); } fclose(fp);
- 695 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 17:28:10 ]
- 読み込み
std::vector<std::string> v2; FILE *fp; fopen_s(&fp, "vec.bin", "rb"); size_t size; fread(&size, sizeof(size), 1, fp); v2.resize(size); for(size_t c=0, e=size; c < e; c++) { fread(&size, sizeof(size), 1, fp); v2[c].resize(size); fread(&v2[c][0], size, 1, fp); //stringの確保するメモリが連続してない環境なら、一度vectorなりに読み込む必要が //あるが、vcなら問題ないので省略 } fclose(fp);
- 696 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 17:33:26 ]
- 最初にもちらっと書いたが、serialization使うとこれですむ
//保存 { vector<string> data; data.push_back("Hello"); data.push_back("World"); ofstream file("save.dat"); boost::archive::text_oarchive oa(file); oa << (const vector<string>&) data; } // 復元 { vector<string> data; ifstream file("save.dat"); boost::archive::text_iarchive ia(file); ia >> data; } 下準備がちょっと面倒だけどな。 興味あったら下記を参照してください。 ttp://www.kmonos.net/alang/boost/classes/serialization.html
- 697 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 17:48:04 ]
- >>694,695
やっぱり要素ごとにサイズと一緒に保存という形しかないんでしょうか。 私のイメージではシリアライズというと、メモリ上にあるオブジェクトの塊を そのままバイナリで一気に書き込むという感じで、だからこそ高速化に役立つと思うのです。 要素ごとに書き込んでいると、カンマ区切りのケースとそれほど時間の差が出ないような・・・ MFCのCObjectを継承したクラスはシリアライズができますが、それはおそらく、 オブジェクトのデータやステートをメモリ空間上で一塊になるようにしている配置しているからこそ できるんじゃないかと思います。 STLではどうもそういう仕組みはないようなので、保存や復元に時間がかかるのは無理ないんでしょうかね。。。 >>696 boostの場合はどうなんでしょうか。 保存と復元を高速化できるかどうかがキモなんです。
- 698 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 17:55:59 ]
- >>690
カンマ区切りの文字列の読み込みに、そんなに時間がかかるとは思えんが。 時間がかかっているのはパースよりもvectorの伸張だろう。 先にカンマの数をカウントしてvector.reserve()するとか、vectorではなくて dequeにするとかの方が速くなるかと。
- 699 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 18:06:48 ]
- >>697
MFCのシリアライズは、各メンバをひとつずつCArchiveに書き込んでたと思うよ CObjectを継承すれば自動的にサポートされるものでもなく、メンバをひとつずつ書き込むコードを各クラスに個別に実装する必要があった シリアライズに対するそのイメージは誤りかと
- 700 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 18:31:32 ]
- データ個数にもよるが保存と読み込み時間を短縮したいなら
まずデータ構造自体から見直すべきだろ。 というか、そこがネックになってる時点で何かが間違ってる。
- 701 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 18:44:43 ]
- >>699,700
そうなんですか。 可変長データ配列のオブジェクトの保存と復元を高速化するためには、 各自が工夫して実装するしかないんですかね。 なんか車輪の再発明のような気が・・・ 配列要素の変更・追加・削除は頻繁にはやらないので、そちらの時間コストは多少増えてもいいんです。 とにかくソフトの起動をコンマ1秒でも速くするために、ドカンと一気に読み込めるようにしたいんですよね。 BYTE型配列1本と、ポインタ・サイズを格納した配列の計2本で、 そういったことをやれそうなイメージはあります。
- 702 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 18:45:42 ]
- vector<string>が固定長なデータじゃないので、要素ごとにアクセス
しなければならないのは仕方が無い。 また、上の例でも1文字ずつカンマをチェックしながらアクセスするよりは、 単純に数倍は速いよ。 ディスクアクセスが気になってるのなら、あらかじめメモリ上に 直列化して、総サイズも一緒に書き込むとか工夫しなさい。 (もともとfread、writeがバッファリングしてるので、あまり効果は無いだろうけど) あとboostのも1要素ごとの読み書きです。 入れ子になってるコンテナの巡回探査がデフォで出来るってだけ。
- 703 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 20:42:53 ]
- ほんとに直列の読み書きがしたければAPI叩くしかないんじゃないかなあ
- 704 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 20:59:26 ]
- >>701
まぁ今回の件に限らず、「コンマ1秒でも速くする」というような目標を持っている場合、 車輪の再発明は避けられないことが多いよね(そうでない場合も勿論あるけど)。
- 705 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 21:01:24 ]
- 本当に速くしたいなら MMX とか SIMD とか使うと
- 706 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 21:54:44 ]
- DANGOさんの出番だな
- 707 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 22:09:39 ]
- : premature optimization is
(省略されました。続きを読むにはワッフルワッフルと書き込んでください)
- 708 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 01:24:43 ]
- ポインタのない言語なら>>686みたいなことは当たり前にできるんだけどな。
ポインタのある言語では、一気に話が複雑になるな。
- 709 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 06:23:29 ]
- データの入出力なんて元々複雑で時間の掛かる処理なんだから
横着するつもりなら効率の劣化には目を瞑るべき。 大体そんな困るほど遅くなることなんぞ滅多に無いし。
- 710 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 12:47:42 ]
- だいたい直列化してないデータを直列させるからシリアライズと
いうのに、最初からメモリ上に直列に並んでると考えるのはどうなのよw
- 711 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 12:51:19 ]
- >>708
ポインタの無いJAVAみたいな言語だって、>686みたいな記述はできても、 要素の実際の読み書きは1つずつだろ?
- 712 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 14:46:07 ]
- >>686
これは素晴らしい!!! すこぶる高速ですね
- 713 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 14:49:44 ]
- >>686
これstringの実装によってはやばくないのかな
- 714 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 15:00:33 ]
- >>686
こんな気持ち悪いコード見たことない
- 715 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 15:01:03 ]
- >>713
そのコードがダメなのははっきりしてるから。 続きも読め
- 716 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 15:01:06 ]
- それ以前の問題。
- 717 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 15:42:55 ]
- ポインタ保存してポインタ復帰してるだけだからな。
- 718 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 16:59:18 ]
- >>709
いや、プログラムの起動を可能な限り速くしたいというニーズはどこにでもある。 3秒で起動するブラウザと1秒で起動するブラウザ、どっちを使いたいかといえば速い方がいいに決まってる。 そういう場合のクラスデータのシリアライズは、1分かかるのを30秒にしたいとかいうオーダーの話ではなくて、 0.3秒かかるのを0.05秒に縮めたいとかいうオーダーなんだよ。 起動時にデシリアライズするオブジェクトの数は1つじゃないしな。 トータルで1秒以内で起動させたいとか、そういうレベルのことをやりたいとなると、 バイト配列の中に直列化したデータ(多少隙間があってもいい)をあらかじめ揃えておいて 一気にシリアライズするという考えも、アリだと思う。
- 719 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 17:02:02 ]
- ファイル読み書きのオーバーヘッドなんてI/O待ちが大半なんだから、
よっぽどアホな処理でもしてない限り大差ないだろ
- 720 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 17:09:11 ]
- >>718
さっきドラゴンボール全巻買ってきた までは読んだ :そこ、高速化したいなら横着せず書かないといけないって書いてんじゃん
- 721 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 17:38:07 ]
- その手のオーバーヘッドで一番時間食うのはstatだったりするんだよな
- 722 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 17:46:02 ]
- >>718
将来まで不変のデータ構造ならいいけど、 少しでも変えると過去のバージョンで直列化したデータが読めなくなるよね。 (すべてのバージョンに対するコンバータを付けるのもどうかと思うし) 痛し痒しだなぁ。
- 723 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 18:12:43 ]
- ちゅーか目的が高速化なのに質問者が面倒がって
既存の実装使おうと食い下がってるだけだじゃん。
- 724 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 18:28:07 ]
- 既存の実装で高速化できないってことは既存の実装がクソだということですよね
- 725 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 18:35:28 ]
- F-1を公道に持っていったら全く使い物にならないのと同じ。
普通車なら速くはないが大体どこでも走れる
- 726 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 19:27:12 ]
- >>724
べっ別にあんたのために実装したんじゃないんだからね。 すべてに効果のある実装は存在しない。自分の目的に合う実装がなければ自分で作る。
- 727 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 19:39:42 ]
- 暇だから素のテキストと長さ情報付きのバイナリで試してみた。
入力データはwindows.hおよびそこからincludeされているファイルから抽出した 全て大文字の先頭以外にアンダーバー入りの定数マクロ(WM_hoge等)18364個。 文字列の平均の長さは20.8文字。 手抜きのために、カンマ区切りではなく改行区切りで保存。 テキスト(ifstream.getline()で読み込み) vector<string> 23ms deque<string> 21ms list<sting> 21ms バイナリ(ifstream.read()で読み込み) vector<string> 14ms deque<string> 12ms list<sting> 12ms ちなみに、VC++2008Stdでコンパイル、E8400のPCで実行。 全て複数回実行した中で一番速かった結果。
- 728 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 19:54:00 ]
- freadに変えればさらに速くなるぜ
- 729 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 23:43:18 ]
- ifstreamをやめて、fopen,fgets,freadにしてみた
テキスト(fgets()で読み込み+改行コード除去) vector<string> 14ms バイナリ(fread()で読み込み) vector<string> 14ms CreateFile,ReadFileも試してみた テキスト(2048バイトずつ読み込み) vector<string> 11ms バイナリ(必要なサイズだけ読み込み) vector<string> 100ms
- 730 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 23:47:59 ]
- つーかstringって時点でバッファに直読みできねーよな
CString::GetBuffer()使ってみ
- 731 名前:729 mailto:sage [2008/06/21(土) 23:51:07 ]
- 結局、ifstream.getline()が遅いだけで、読み込み部分を最適化したら
テキスト形式でもバイナリ形式でも差がない感じ。 ちなみにテキスト形式でファイル一気読みでは、稀に10msが出る程度。 あと、バイナリ形式でReadFile()でチマチマ読むのは何故か遅かった。 fread()は速いのにね。
- 732 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 23:51:41 ]
- それはスレ違い。
- 733 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 23:56:05 ]
- >>731
それは「何故か」でも何でもなく明らかなことだ fread()はチマチマじゃなくて「一気に」バッファに読み込んで 読み込んだ分だけユーザに渡してるから速いんだよ
- 734 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 23:57:47 ]
- >>732
スレ違いかもしれないが重要なことだろ。 stringに高速にデータを読み込む方法は存在しない。 必ずコピーが発生するのだから。 カーネルバッファ→stdioバッファ→ユーザバッファ(典型的にはchar[])→string こんな感じ ほらみろ、効率悪い
- 735 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 23:59:58 ]
- stringの実装を知っていれば環境依存の方法で…
ってもうSTL作者になる以外ないな
- 736 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 00:00:38 ]
- >>730
この場合だと、GetBuffer使うメリットねーと思う。
- 737 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 00:01:56 ]
- >>736
いーやある。 fread()ではstringに直接読み込めないので一時的にchar[]に読み込んでコピー するしかないが、 CString::GetBuffer()ならfreadで直接読み込める つまり、一段コピーを減らせる
- 738 名前:736 mailto:sage [2008/06/22(日) 00:03:33 ]
- >>737
理由は>>733が書いてる。GetBufferつかったら、それ以上に読み込み遅くなるだろ。
- 739 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 00:05:30 ]
- >>738
は?何言ってんの。 CStringで適当なサイズをリザーブしといて、 GetBuffer()で取ったchar*のポインタにfread()しろっつってんだぞ? 間違いなくchar[]に読み込んでからstd::stringにコピーするより 速いよ。
- 740 名前:739 mailto:sage [2008/06/22(日) 00:09:03 ]
- ああ、話のズレがわかった。
俺はstd::stringなんて使わなきゃ速いよつってるんだ。 最後にstd::stringにコピーしなきゃならないんなら意味ないわな、 そりゃ。 コピー君だもの。
- 741 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 00:11:10 ]
- 単に速いだけの話しならstd::istreambuf_iteratorとstd::ostreambuf_iterator
が速いんじゃないの?書式化なしだし
|

|