-
Notifications
You must be signed in to change notification settings - Fork 163
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
CDocLine の容量削減 #988
CDocLine の容量削減 #988
Conversation
✅ Build sakura 1.0.2120 completed (commit 008665cdda by @) |
✅ Build sakura 1.0.2121 completed (commit 8911afee50 by @beru) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
容量を減らすための方法に納得がいっていないです。
CDoclineの容量を削減したい、とか、その必要がありそう、ってとこには同意です。
enumの宣言型をcharに変えてるんですけど、8bit整数の判定より32bit整数の判定のが速いはずです。
影響を構造体からの取り出し時のみに抑えられるように ビットフィールド で代替するって手が使える気がします。
数値、構造体、数値だとアラインメントがうまく行かんはずなので、メンバ入替をするのは問題ない認識です。
やや別件寄りな話になってしまいますけど、CEolがCDocLineクラスの一部になってることには違和感を感じています。何故かというとCEolは改行コードを画面表示するためのものだからです。サクラエディタには、内部的な行データを表すクラスが2つありますが、CDocLineはデータ寄りのクラスです。画面表示のための情報をデータ寄りのクラスが持っているのはおかしいと思います。
CMemoryの仮想デストラクタを削るのは反対です。
仮想デストラクタを削ってしまうと、劣化版スマートポインタとしてのCMemoryの役割が果たせなくなります。(つまり、変数がスコープを抜けるときに手動で解放処理しないといけなくなる)
CMemory(派生クラスを含む)を廃止したい、であれば賛成できる余地がありますが、そのためには準備作業が必要だと思っていて、現状では賛同できません。
CNativeWのデバッグポインタは、natvisを使って代替できます。
前にビルドエラーの原因になったときに、現代的手法への差し替えを提案したことがあります。
このPRの対応だと単にデバッグ変数を削ってるだけなのであんまり良くない気がします。
速度については仮にこのPRで低下したとしても(計測してないのでどう変化したか良く分かりませんが)他の変更でリカバリー出来れば良いと考えています。
自分も最初ビットフィールド指定が使えるかと思ったんですが、実際に指定してみると下記のエラーメッセージが出ました。
ビットフィールド指定出来る型は限られているようです。 容量を節約するにはビット単位で詰めた方がより縮められるのは確かで、拡張情報の個々のメンバをクラスにしないであと行末コードについても構造体に含めて扱うのが容量の節約の為には良いと思います。しかしその変更を行うと差分の量が激しくなるので今回は実施しませんでした。
バッファ(文字列データの)中にも改行コードは持っているようなので別のメンバとしても抱えているのは実装を単純化する為なんですかねぇ?
「劣化版スマートポインタとしてのCMemory」ってのがよくわかりません。コード例で示してもらう事は出来ますか? 一般的にデストラクタを virtual にするのは派生クラスを動的に確保したものを後で解放する際に 基底クラスのポインタ経由で行うと派生クラスのデストラクタが呼ばれないのが問題になります。 あと現時点では派生クラスの
|
✅ Build sakura 1.0.2139 completed (commit 93b545782b by @beru) |
この件は同意。
指定できないなら仕方ないですな 😢
容量を節約するために型に手を入れようとしているメンバが「すべてpublicな件」も関係してそうな気がします。ぼく個人は、得意な言語がほぼOOPなこともあり、基本的にオブジェクト思考です。全メンバがpublicだと設計をサボったうん○クラスに見えてしまいます。仮にメンバがカプセル化されていたなら、内部実装をintに変更してビットフィールドにしても影響は出ないわけで:smile:
え、そうなの?
完全に別件な話になってしまいますので別件で具体的に話すのが良さそうです。
これはぼくの勘違いかもしれません。
「不要だ」と判断した場合を除いて、既存機能を削るには代替を提供すべきだと思います。 |
容量を節約する為に変えています。あれ?話が最初に戻ってるよな…。
C++言語の機能の活用はしたいですね。
拡張情報構造体のサイズを7バイトにまで節約したんですが、その後にパディング無しで EOL のメンバーを入れる事で 表とかで解説用意すれば分かりやすいと思いますが、どこかに型レイアウトの表を自動生成するコードが無いかなぁ…(さぼり。
コンパイラが派生クラスのインスタンスだと判断出来るケースでは基底クラスのデストラクタの呼び出しもちゃんと自動的に追加されますよ。そうじゃないとプログラミング言語として使い勝手が悪すぎるでしょう。
ウォッチウィンドウで書式指定すれば |
内部実装をintに変えたらビットフィールドにできますよね?
理解。7bytesのstructの直後1バイトが埋まったっちゅーことですね。 例示はstructの開始アドレスが奇数な場合はpaddingされるんじゃないか?ということを言ってました・・・あとでやってみます:smile:
すんません、言葉が足らんかったです。 ここだけ切り出してこちらでPR作成してもいいですが、どうします? |
ぼくが読み違ってますね。 「不要と判断したわけではないと思う(主観)」に対して、 主たる目的がサイズ削減で、不要と判断したゴミを削るだけ。 そうなると、ここの指摘は「本当にただのゴミ?」ってとこに争点が移ります。 |
コードの差分をあまり増やさない形でいけるなら良いですね。
https://devblogs.microsoft.com/cppblog/project-support-for-natvis/ プロジェクト単位の natvis がサポートされていたのを知りませんでした。 自分がそのデバッグ用のメンバーを使っていない事もあって有難味が分かっていないのかもしれないですね。ただ構造体のサイズを増やさない方法で同等の事が実現出来るのであればそれが良いと思います。 @berryzplus さんの方で先にデバッグ用メンバー削って natvis ファイルをプロジェクトに追加する PR を用意してもらっても良いでしょうか? |
自分が必要としてる派の心の声を受信出来ていないんだと思います。 Releaseビルドではプリプロセッサで消えるのでそこまで存在を消さないと困るという訳では無いです。というか消したのって基底クラスのデストラクタの まぁとはいえ普段編集するファイルって多くても数千行くらいなのでそこまでサイズ切り詰めるためにケチケチする必要は nothing と言われたら言い返せません。8バイト削れたら 2^24行で 128MB節約できるのはおいしいですけど、その考えをエスカレートさせるとポインタの代わりに index を使うように大改造を進めてしまいそうです。。 |
うぃ。準備中っす。 デバッガ使って調べてみたんですけど、変更前のCDocLineのサイズはこんなんでした。
|
なおこの PR では 拡張情報構造体の位置が
|
✅ Build sakura 1.0.2147 completed (commit 38dc64fab9 by @) |
確認完了、ぼくの勘違いでした。
ならNP(No Problem)っちゅーことで。
x64にはなんか制約があったんですよね、確か。 > アラインメントが8バイトなので 確保が2の累乗単位なので 56 ⇒ 40 にする意義が微妙な気もしますが、memory_resourceの本来の用途は、様々な型でメモリ確保・開放を共有できる機構を提供することにあるっぽいので、サイズ削減により64との差が開くことには意味があると思っています。 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
疑問はすべて解消したので、進めて良さそうに思います。
対応ありがとうございます。
x64 だとポインタが 8バイトなので、ポインタ変数のアライメントは 8 バイトになるようにコンパイラが自動的に調整するんじゃないかと思います。
確保が2の累乗単位なのはVC++の |
@berryzplus さん レビューありがとうございます。マージします。 |
CDocLine の容量削減
PR の目的
CDocLine
のインスタンスのサイズを削減する事でメモリ使用量を抑えるカテゴリ
PR の背景
行数の分だけ
CDocLine
のインスタンスが作成されるので行数が非常に多いファイルを開いたりするとその分だけ大量にメモリを使用します。このPRでは x64 Release ビルドの場合に
sizeof(CDocLine)
を 56 から 40 に削減しました。インスタンス1つにつき16バイト減っているので16777216行あるファイルを開いた場合に消費されるメモリ使用量が256MiB削減される事になります。どのようなやり方で
CDocLine
のサイズを削減したかについて下記に記載します。容量を節約する為に一部の列挙型のサイズを1バイトにしたり、
CDocLine
クラスのメンバーの順序を入れ替えたりパディングを無しにして詰めました。またメモリバッファクラス(
CMemory
)の容量を減らす為にデストラクタを仮想ではないように変更しました。仮想関数を持つとインスタンスに仮想関数テーブルへのポインタの隠しメンバがコンパイラによって自動的に挿入されるのでそれを避ける為です。メモリバッファクラスとその派生クラスはポリモーフィズムは使用していない為、不要と判断して削除しました。CNativeW
クラスにデバッグビルド時にデバッグ用のメンバーm_pDebugData
が追加されていましたが、ウォッチウィンドウで書式指定すれば同じ事が実現出来るので不要と判断しました。PR のメリット
メモリ使用量が減ります。
PR のデメリット (トレードオフとかあれば)
詰めて記録するようにした事により処理速度にわずかに悪影響が出るかもしれません(未確認)。
PR の影響範囲
CMemory
,CNative
,CNativeW
関連CDocLine
関連関連チケット
#985 ではメモリプールを使っていますがその変更もメモリ使用量を減らす効果が有ります。