INASOFT 管理人のひとことフリーソフトダウンロードサイト「INASOFT」の管理人 矢吹拓也 が日々の「ひとこと」を語るページです。 2021年1月1日より、旧ブログ(blog.inasoft.org)からお引越ししました。 ・INASOFT Webサイト: https://www.inasoft.org/ ・管理人のふたこと(長文記事/寄稿文): https://www.inasoft.org/talk/ 2022年7月下旬より再び本業多忙化してきているため、更新頻度は落ちます。 [2022/7/24 19:32] Tweet ■ListView to CSVのメモリ使用効率化策2012年 3月12日(月) 0:01:48 [はてなダイアリーから転記] |
RSS配信中 | |
ListView to CSVの主な動作には3つの動作モードがあります。
ではなく
です。(「開く」は、ファイル出力の後に指定アプリケーションを開く動作となるため、実は「ファイル出力」と同じルートを辿ります) 上記3つの動作は、それぞれ動作効率化施策が異なるため、違う動作モードとならざるを得ません。 ファイル出力の場合、約64KBごとにバッファしてファイルへ出力するため、64KB程度の固定メモリを確保しておいて、文字列を溜め込んでいます。 (さっき気づいたのですが、実際にはUnicodeの文字換算だったので、上記の2倍のバッファが準備されていました。まぁ、微々たる差です) 次にクリップボード出力の場合は、std::wstring 型の文字列変数に文字をどんどん溜め込んでいき、最後にクリップボード転送用のグローバルメモリへ一気にコピーします。 従って、メモリ効率化施策は (VC++実装の)basic_string のメモリ確保の方法に従うことになり、また、最終的にはグローバルメモリ分とローカルメモリ分の2倍のメモリ容量を必要とします。あまり効率が良いとは言えないかもしれません。 最後に「サンプルウィンドウ出力」ですが、こちらもクリップボードの場合と同様ですが、最後にはローカルメモリからサンプルウィンドウのEDIT BOXへ文字列を渡すだけとなっています。効率の善し悪しはクリップボードの場合と同じです。 というわけで、クリップボード出力の場合のメモリ確保効率化を行いたいところです。 どこが悪いのかというと、std::wstring は内部的に、あらかじめ確保したバッファが足りなくなった際、「新しく2倍のサイズのメモリ領域を別に準備し、そちらへコピーする」という動きをします(2倍かどうかは実装による)。この再確保とコピーは、それなりに時間がかかりますし、一時的に無駄な領域を必要としますし、なによりもメモリ内にフラグメントが発生し得ます。 なので、文字列を溜め込むときはstd::list<std::wstring>かなんかの形にしておいて、メモリ再確保時の無駄がなるべく発生しないようにしてみたい。 とりあえずそんなことを考え中です。 目次の表示: ブログではないので、コメント機能とトラックバック機能は提供していません。ご質問・ご意見等はメール、フィードバックまたはTwitter等からお願いします。いただいたご質問・ご意見などは、この「管理人のひとこと」の記事に追加、あるいは新規の記事にする形で一部または全文をそのまま、あるいは加工させていただいた上で、ご紹介させていただく場合があります。 当サイトでは掲載内容による不具合等に関する責任を持ちません。また、内容の正確性についての保証もありませんので、情報をご利用の際は、利用者の自己責任で確認をお願いします。 |
- 最近の更新 - |
|
3212362 (+0059)[+0214] Copyright© 2010-2024 INASOFT |