INASOFT 管理人のひとこと


フリーソフトダウンロードサイト「INASOFT」の管理人 矢吹拓也 が日々の「ひとこと」を語るページです。
2021年1月1日より、旧ブログ(blog.inasoft.org)からお引越ししました。
・INASOFT Webサイト: https://www.inasoft.org/
・管理人のふたこと(長文記事/寄稿文): https://www.inasoft.org/talk/
本業の方のお仕事が再び忙しくなりつつあるので、断続的にしばらく更新が止まることがあります。

目次 | ←前へ / 2012-03-12 00:01 / 次へ→ / 最新へ⇒

■ListView to CSVのメモリ使用効率化策

2012/ 3/12 0:01:48


RSSRSS配信中

https://www.inasoft.org/








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>かなんかの形にしておいて、メモリ再確保時の無駄がなるべく発生しないようにしてみたい。

とりあえずそんなことを考え中です。





目次 | ←前へ / 2012-03-12 00:01 / 次へ→ / 最新へ⇒


目次の表示:


ブログではないので、コメント機能とトラックバック機能は提供していません。ご質問・ご意見等はメールフィードバックまたはTwitter等からお願いします。いただいたご質問・ご意見などは、この「管理人のひとこと」の記事に追加、あるいは新規の記事にする形で一部または全文をそのまま、あるいは加工させていただいた上で、ご紹介させていただく場合があります。
当サイトでは掲載内容による不具合等に関する責任を持ちません。また、内容の正確性についての保証もありませんので、情報をご利用の際は、利用者の自己責任で確認をお願いします。本ページは公開から1年半後の任意のタイミングで削除される予定です。




2554982 (+0126)[+0556]

Copyright© 2010-2021 INASOFT