◀ANSI版開発トップへ
  • 1226 画面がちらつく?
    • 1227 Re:画面がちらつく?
      • 1228 Re2:画面がちらつく?
    • 1235 Re:画面がちらつく?
      • 1237 Re2:画面がちらつく?
        • 1241 Re3:画面がちらつく?
          • 1253 Re4:画面がちらつく?
            • 1256 Re5:画面がちらつく?
            • 1258 Re4:画面がちらつく?
              • 1259 Re4:画面がちらつく?
                • 1262 Re5:画面がちらつく?
                • 1264 Re5:画面がちらつく?
                • 1296 Re4:画面がちらつく?
                  • 1319 Re4:画面がちらつく?
                    • 1325 Re5:画面がちらつく?
                    • 1327 Re4:画面がちらつく?
                      • 1329 Re4:画面がちらつく?
                        • 1331 constとstatic
                          • 1332 Re:constとstatic
              • 1263 Re5:画面がちらつく?
                • 1271 Re5:画面がちらつく?
                  • 1274 Re5:画面がちらつく?
                    • 1275 Re6:画面がちらつく?
                    • 1279 Re5:画面がちらつく?
                      • 1280 Re6:画面がちらつく?
                        • 1297 Re6:画面がちらつく?
                          • 1309 Re7:画面がちらつく?
                            • 1317 Re7:画面がちらつく?
                              • 1320 Re8:画面がちらつく?
                                • 1355 Re9:画面がちらつく?
                          • 1314 Re7:画面がちらつく?
                            • 1318 Re7:画面がちらつく?
  • [1226] 画面がちらつく? げんた 2002年01月19日 20:47

    ホームページを見ていたら「サクラエディタは画面がちらついて使い物にならない」と書かれているのを発見したんですが,この辺検証できる方いらっしゃいますか?
    • [1227] Re:画面がちらつく? やざき 2002年01月19日 21:04

      ▼ げんたさん
      > ホームページを見ていたら「サクラエディタは画面がちらついて使い物にならない」と書かれているのを発見したんですが,この辺検証できる方いらっしゃいますか?

      ルーラーと、カーソル行のアンダーラインはちらつきます。
      また、aaaaaと100個ぐらいつらねてコピーし、同じ行に貼り付けていくと、50000文字くらい書いたところでちらつきが目立ちます。

      そんなところでよろしいでしょうか?
      • [1228] Re2:画面がちらつく? げんた 2002年01月19日 22:15

        ▼ やざきさん
        > ルーラーと、カーソル行のアンダーラインはちらつきます。
        こちらだけでも何とかならないでしょうかねぇ。

        > また、aaaaaと100個ぐらいつらねてコピーし、同じ行に貼り付けていくと、50000文字くらい書いたところでちらつきが目立ちます。
        こちらはテキスト処理を見直さないと難しいかもしれませんね。
    • [1235] Re:画面がちらつく? hor 2002年01月20日 15:43

      ▼ げんたさん
      > ホームページを見ていたら「サクラエディタは画面がちらついて使い物にならない」
      > と書かれているのを発見したんですが,この辺検証できる方いらっしゃいますか?

      「ちらつき」ではありませんが、描画の遅さに「使い物にならん」と感じたことがあります。

      マシンスペックによっては再現しないかもしれませんが、
      ・折り返し桁=10240
      ・URLの色分け=On
      ・10240を超える文字数の行が画面内にある && 全角文字がいっぱい
      の状態で「→」キーを押し続けて横スクロ-ルさせたりすると悲しいことになります。

      URLの色分けをOffにするとかなりマシになるので、この状態でいつも使っていますが、
      IsURLやDispLineNewあたりのロジックを見直せばもっと快適になるような気がします。
      • [1237] Re2:画面がちらつく? げんた 2002年01月20日 15:58

        ▼ horさん
        > マシンスペックによっては再現しないかもしれませんが
        どのくらいのマシンを使っていますか?

        このエディタも、nakataniさんが開発を始めたころはi486のPC-9821を使っていたので遅いマシンでも動くように考慮されていたんですが、私がその後使っていたのはCeleron 300MHz程度で現在はCeleron700前後のマシンを使っていますので性能改善という意識がほとんどなかったのも事実ではあります。
        • [1241] Re3:画面がちらつく? hor 2002年01月20日 17:32

          ▼ げんたさん
          > > マシンスペックによっては再現しないかもしれませんが
          > どのくらいのマシンを使っていますか?

          ・・・ 再現しませんか?

          Pentium Pro 200MHz / 163MB RAM じゃぁ性能低すぎ?
          • [1253] Re4:画面がちらつく? げんた 2002年01月21日 09:45

            >・・・ 再現しませんか?
            3万文字くらいの行を作ったら全然使い物にならない...表示に10秒くらいかかる.URL色分けも時間がかかりますが,正規表現による検索文字列表示はもっとひどい.

            ただ,正規表現でなければ時間がかからないこと,みくさんが用意してくれた正規表現による色分けは速度低下の原因にならないことから,マッチの度にパターンのコンパイルをやっている可能性があります.

            内部のコード表現をUnicodeに統一した方が,1バイト文字利用時のメモリ効率が悪化する代わりに区切りが2バイト固定になるので文字判定が不要になって速度改善が見込まれるかな?簡単に変更できるとは思いませんが.
            • [1256] Re5:画面がちらつく? hor 2002年01月21日 13:10

              ▼ げんたさん
              > 3万文字くらいの行を作ったら全然使い物にならない...表示に10秒くらいかかる.
              > URL色分けも時間がかかりますが,正規表現による検索文字列表示はもっとひどい.
              >
              > ただ,正規表現でなければ時間がかからないこと,
              > みくさんが用意してくれた正規表現による色分けは速度低下の原因にならないことから,
              > マッチの度にパターンのコンパイルをやっている可能性があります.

              マッチの度にパターンをコンパイルしてるってことはないと思いますが、
              IsSearchString周辺の実装を、RegexIsKeywordっぽく変更すれば改善しそうですね・・・
            • [1258] Re4:画面がちらつく? みく 2002年01月21日 20:02

              >発言者: げんた
              >3万文字くらいの行を作ったら全然使い物にならない...表示に10秒くらいかかる.URL色分けも時間がかかりますが,正規表現による検索文字列表示はもっとひどい.

              正規表現はしかたないっす。機能に対する代償は大きいです。
              #UNIXで使われるregexがどのくらいの性能か試してみたい気もします。
              URLはもうちょっと高速化できるかなぁ。機会があれば試してみます。

              もうひとつ思いつき。
              CMemoryでメモリを毎回アロケートし直していますが、これをやめて
              みたらどうでしょう。アロケートサイズを例えば8バイト単位にし
              て、拡張・縮小を行うとか。

              #define EXTEND_SIZE 8
              SetData(char *pszNewData, int nRequestSize)
              {
              if( m_nAllocSize < nRequestSize
              || m_nAllocSize > nRequestSize + EXTEND_SIZE ){
              Empty();
              m_nAllocSize = ((nRequestSize + EXTEND_SIZE) / EXTEND_SIZE) * EXTEND_SIZE;
              pszData = malloc(nAllocSize);
              }
              memcpy(pszData, pszNewData);
              }
              みたいな。

              メモリ消費量は増えますが、入力するたびにメモリ解放・確保が
              繰り返されるよりはよいと思います。
              • [1259] Re4:画面がちらつく? みく 2002年01月21日 21:06

                >発言者: げんた
                >URL色分けも時間がかかりますが

                非常に簡単な高速化の方法:
                ・MemCharNextはやめましょう。
                ・2箇所でIsMailAddress(, strlen(s), )としてますが、nTextLenを使えばよいです。
                ・URLキャラかどうかのテーブル(キャラクタ=配列番号)用意する。if(... || ...)の繰り返し判定はなくなる。
                • [1262] Re5:画面がちらつく? やざき 2002年01月22日 00:14

                  > ・MemCharNextはやめましょう。

                  MemCharNextで、わざわざ次の文字位置を返しているのに、
                  利用しているほうは、次の文字へのオフセットを利用しているのは
                  違和感アリます。

                  次の文字へのオフセット(今の文字のバイト数と一緒)を返す関数を新設してもいいかなぁ。
                • [1264] Re5:画面がちらつく? hor 2002年01月22日 13:16

                  ▼ みくさん
                  [1258]
                  > CMemoryでメモリを毎回アロケートし直していますが、これをやめ
                  [1259]
                  > 非常に簡単な高速化の方法:
                  > ・MemCharNextはやめましょう。
                  > ・2箇所でIsMailAddress(, strlen(s), )としてますが、nTextLenを使えばよいです。
                  > ・URLキャラかどうかのテーブル(キャラクタ=配列番号)用意する。if(... || ...)の繰り返し判定はなくなる。

                  少しでも改善するのならぜひ実装下さい。お願いします。
                • [1296] Re4:画面がちらつく? みく 2002年01月23日 19:43


                  >非常に簡単な高速化の方法:
                  >・2箇所でIsMailAddress(, strlen(s), )としてますが、nTextLenを使えばよいです。

                  テストしてないが、とりあえずetc_uty.cpp:
                  781:if( TRUE == IsMailAddress( &pszText[nURLHeadLen], nTextLen - nURLHeadLen, pnUrlLen ) ){
                  824:if( TRUE == IsMailAddress( pszText, nTextLen, pnUrlLen ) ){
                  です。1マイクロ秒くらいは速くなるんでは...
                  • [1319] Re4:画面がちらつく? みく 2002年01月24日 23:39


                    >>非常に簡単な高速化の方法:

                    IsURLを最適化してみたら、だいたい2倍高速化できました。
                    URLとして認識するキャラクタはてきとーに直してください(速度は変わりません)。
                    ソースは IsURL.zip としてアップしておきます。
                    #関数内constはやめましょう。必ずstatic constでってのが教訓かな。
                    • [1325] Re5:画面がちらつく? hor 2002年01月25日 16:11

                      ▼ みくさん
                      >
                      > >>非常に簡単な高速化の方法:
                      >
                      > IsURLを最適化してみたら、だいたい2倍高速化できました。
                      > URLとして認識するキャラクタはてきとーに直してください(速度は変わりません)。
                      > ソースは IsURL.zip としてアップしておきます。
                      > #関数内constはやめましょう。必ずstatic constでってのが教訓かな。

                      快適になりました! ありがとうございます。

                      別件ですが、矩形複数行のDel,Cut,Pasteが恐ろしく遅かったので関連処理を見直してみました。
                      1000行くらいの矩形データをDel,Cut,Pasteすると違いがはっきり出ると思います。
                      → RectangleEdit.lzh

                      ついでに記事番号[1300]のマーク復元バグの修正分も入れておきました。(忘れてしまいそうなので)
                    • [1327] Re4:画面がちらつく? げんた 2002年01月25日 20:07

                      ▼みくさん
                      >#関数内constはやめましょう。必ずstatic constでってのが教訓かな。
                      これの詳細説明希望.
                      関数内で #defineして後で#undefしているのと関係あるんですよね.
                      • [1329] Re4:画面がちらつく? みく 2002年01月25日 20:45

                        >タイトル: Re4:画面がちらつく?
                        >発言者: げんた
                        >▼みくさん
                        >>#関数内constはやめましょう。必ずstatic constでってのが教訓かな。
                        >これの詳細説明希望.

                        試しにstaticをはずしてみると性能が2倍以上悪くなります。
                        なんか変な処理が動いているように感じます。
                        最初は気づかなくてぜんぜん速くないのでがっかりしてました。
                        推測ですが、constだけだとユーザ見えがconstなだけで関数内に
                        入ったときにデータのコピー(作成)が発生しているんではない
                        でしょうか。static const だと発生しないみたい。

                        あるマシンでの測定結果(10万回ループ):
                        24秒 元のIsURL関数
                        22秒 最適化したIsURL関数const
                        9秒 最適化したIsURL関数static const

                        関数内の変数宣言はスタックに割り当てられますが、
                        static付けると関数を抜けても確保されたままですよね。
                        int count(){
                        static int a = 0;
                        return ++a;
                        }


                        >関数内で #defineして後で#undefしているのと関係あるんですよね.

                        関係ないです。
                        短いdefine名なので誤作動防止のためundefしてます。
                        • [1331] constとstatic げんた 2002年01月25日 21:52

                          ▼みくさん
                          >推測ですが、constだけだとユーザ見えがconstなだけで関数内に
                          >入ったときにデータのコピー(作成)が発生しているんではない
                          >でしょうか。static const だと発生しないみたい。

                          えーと,staticとconstは独立な概念ですよね.
                          関数内constが悪いのではなくて,static無し配列が悪いと解釈するべきだと思います.

                          >int count(){
                          > static int a = 0;
                          > return a;
                          >}
                          という関数で,aをstatic int, const int, const static intと変更してアセンブラ出力を調べてみました.
                          Borland C++を使って速度で最適化をかけた結果は以下の通りです.(長いのでコメントを削除して抜粋しています)

                          ▼static
                          _DATA segment dword public use32 'DATA'
                          align 4
                          $ikofbaia label dword
                          dd 0
                          _DATA ends
                          _TEXT segment dword public use32 'CODE'
                          @count$qv segment virtual
                          @@count$qv proc near
                          ?live16385@0:
                          push ebp
                          mov ebp,esp
                          mov eax,dword ptr [$ikofbaia]
                          pop ebp
                          ret
                          @@count$qv endp
                          @count$qv ends
                          _TEXT ends

                          * データ領域にメモリを確保してそこを参照している.

                          ▼const
                          _DATA segment dword public use32 'DATA'
                          _DATA ends
                          DGROUP group _BSS,_DATA
                          _TEXT segment dword public use32 'CODE'
                          @count$qv segment virtual
                          @@count$qv proc near
                          ?live16385@0:
                          push ebp
                          mov ebp,esp
                          xor eax,eax
                          pop ebp
                          ret
                          @@count$qv endp
                          @count$qv ends
                          _TEXT ends

                          * 定数と同様に扱われている.スタック上に領域は確保されない.

                          ▼const static
                          _DATA segment dword public use32 'DATA'
                          align 4
                          $aoofbaia label dword
                          dd 0
                          _DATA ends
                          _TEXT segment dword public use32 'CODE'
                          @count$qv segment virtual
                          @@count$qv proc near
                          push ebp
                          mov ebp,esp
                          xor eax,eax
                          pop ebp
                          ret
                          @@count$qv endp
                          @count$qv ends
                          _TEXT ends

                          * 定数と同様に扱われているが,メモリ領域も確保されている.(ちょっとタコ)

                          以上の結果から定数のconstは使っても問題ありません.

                          > 短いdefine名なので誤作動防止のためundefしてます。
                          というのはスコープの概念がある変数で

                          const char urF = 1;

                          と記述した方が,undefを使わなくても良い分スマートではないでしょうか.
                          • [1332] Re:constとstatic 蛭子屋 2002年01月25日 22:16

                            ▼ げんたさん
                            > >int count(int x){
                            > > static int a = x;
                            > > return a;
                            > >}

                            のstaticをconst,static constと入れ替えて試すと
                            もうちょっと違いが出るかも。
              • [1263] Re5:画面がちらつく? やざき 2002年01月22日 00:19

                > CMemoryでメモリを毎回アロケートし直していますが、これをやめて
                > みたらどうでしょう。

                毎回Emptyして、AllocBufferして、AddDataは無駄ですよね。ここを改善するのは大いに賛成。
                • [1271] Re5:画面がちらつく? みく 2002年01月22日 19:07

                  >タイトル: Re5:画面がちらつく?
                  >発言者: やざき
                  >> CMemoryでメモリを毎回アロケートし直していますが、これをやめて
                  >> みたらどうでしょう。
                  >
                  >毎回Emptyして、AllocBufferして、AddDataは無駄ですよね。ここを改善するのは大いに賛成。

                  ちょっと調べてみました。
                  CMemoryはバッファサイズを持っていますね。でも、有効に利用されてない。
                  Appendのときはまだよいのですが、SetDataのときには毎回解放&確保が発生
                  してますので、ここを直すことになります。
                  あと、malloc関数は内部16バイト単位の拡張でした(VC++6の場合)。
                  だから、16バイト単位以下ならメモリ消費量は変わりません。
                  • [1274] Re5:画面がちらつく? みく 2002年01月22日 20:35


                    試してみたらかえって性能が悪くなった。なんで?
                    #もう少し調べてみます。

                    性能測っててわかったんですが、BorlandよりVCの
                    方が性能が10~20%良いです。
                    • [1275] Re6:画面がちらつく? やざき 2002年01月22日 20:54

                      ▼ みくさん
                      >
                      > 試してみたらかえって性能が悪くなった。なんで?
                      > #もう少し調べてみます。
                      >
                      > 性能測っててわかったんですが、BorlandよりVCの
                      > 方が性能が10~20%良いです。

                      よろしくお願いします。期待してます。
                    • [1279] Re5:画面がちらつく? みく 2002年01月22日 22:52


                      BSキーで文字削除をしたときに5~10%くらい性能が
                      よくなるくらいで、DELキーでの削除、文字入力などは
                      変化なしでした。拡張単位を大きくするとかえって遅く
                      なったり。。。mallocは以外に速いということで、終わ
                      りにします。
                      #理論的には速くなるんだけどねぇ。

                      他の怪しいところ:
                      描画系のほうに時間のほとんどを費やしていそうな気がしてきました。
                      ルーラーのちらつきがあるので、タイトルみたいに毎回再描画してるみたい。
                      ペンとかブラシを毎回Create/Deleteするのはどんなものか。
                      • [1280] Re6:画面がちらつく? やざき 2002年01月22日 23:43

                        ▼ みくさん
                        >
                        > BSキーで文字削除をしたときに5~10%くらい性能が
                        > よくなるくらいで、DELキーでの削除、文字入力などは
                        > 変化なしでした。拡張単位を大きくするとかえって遅く
                        > なったり。。。mallocは以外に速いということで、終わ
                        > りにします。
                        > #理論的には速くなるんだけどねぇ。

                        おお。そうなんですね。
                        若干でも早くなるなら取り込みましょうよ。


                        > 他の怪しいところ:
                        > 描画系のほうに時間のほとんどを費やしていそうな気がしてきました。
                        > ルーラーのちらつきがあるので、タイトルみたいに毎回再描画してるみたい。
                        > ペンとかブラシを毎回Create/Deleteするのはどんなものか。

                        描画系は、ExtTextOutに、必要最低限の描画をさせられればもっとはやくなるかなぁと思います。
                        いま、ExtTextOutにクリッピングさせてますが、自前でもっている情報だけでできるかぎりクリッピングしたらいいんじゃないかなぁ。
                        と思って、挫折してます。結構大きいと思うんですけど、どんなもんか確認はしてません~。
                        • [1297] Re6:画面がちらつく? みく 2002年01月23日 19:43


                          >おお。そうなんですね。
                          >若干でも早くなるなら取り込みましょうよ。

                          とりあえずテスト版を cmemory.zip として置いておきました。
                          リリース版には入れないでね。
                          #どのくらいの性能か調べてみてください。
                          • [1309] Re7:画面がちらつく? あろか 2002年01月24日 01:55

                            ▼ みくさん
                            [1297]
                            > とりあえずテスト版を cmemory.zip として置いておきました。
                            > リリース版には入れないでね。
                            ReNewBufferとAllocBufferっておなじことしてませんか?
                            AllocBufferはEmpty呼ばなくてもよい?

                            [1274]
                            > 性能測っててわかったんですが、BorlandよりVCの
                            > 方が性能が10~20%良いです。
                            質問1:VCのDebugビルドだとどんな具合ですか?
                            質問2:BCCは特にどんな操作で遅いのでしょう?
                            • [1317] Re7:画面がちらつく? みく 2002年01月24日 23:39


                              AllocBuffer
                               未確保なら確保する。→malloc
                               確保済みだが領域不足なら拡張する。→realloc
                               過去のデータは保持される。
                              ReNewBuffer
                               未確保なら確保する。→malloc
                               確保済みだが新しく必要な領域が少し減少するくらいならそのまま使う。
                               領域サイズが不足するか大きく減少するなら再割り当てを行う。→free/malloc
                               過去のデータは保持されない。

                              Borland使わないのでわからないんですがBorlandでは実行速度で最適化されてますか。
                              • [1320] Re8:画面がちらつく? あろか 2002年01月25日 01:02

                                ▼ みくさん
                                >
                                > AllocBuffer
                                >  未確保なら確保する。→malloc
                                >  確保済みだが領域不足なら拡張する。→realloc
                                >  過去のデータは保持される。
                                > ReNewBuffer
                                >  未確保なら確保する。→malloc
                                >  確保済みだが新しく必要な領域が少し減少するくらいならそのまま使う。
                                >  領域サイズが不足するか大きく減少するなら再割り当てを行う。→free/malloc
                                >  過去のデータは保持されない。
                                よくわかりました。ありがとうございます。
                                で、提案です。
                                1+ReNewBufferのサイズ計算がけっこう複雑ですが、大抵の場合キー入力して近いうち大きくすることが判っているのでもっと大雑把な計算でもよいのでは?
                                2+Empty() の代わりに m_nDataBufSize=0; で AllocBuffer しては?

                                > Borland使わないのでわからないんですがBorlandでは実行速度で最適化されてますか。
                                よくわからないで設定してました。今ヘルプを見たら「サイズで最適化」だそうです。
                                そのくせVC(お試し版)より少し大きいですね。
                                • [1355] Re9:画面がちらつく? あろか 2002年01月27日 01:44

                                  ▼ あろかさん
                                  > 2+Empty() の代わりに m_nDataBufSize=0; で AllocBuffer しては?
                                  まちがえました。これじゃメモリリークしますね。
                                  *m_pData=0 ならいいのかな。
                          • [1314] Re7:画面がちらつく? やざき 2002年01月24日 11:51

                            ▼ みくさん
                            >
                            > >おお。そうなんですね。
                            > >若干でも早くなるなら取り込みましょうよ。
                            >
                            > とりあえずテスト版を cmemory.zip として置いておきました。
                            > リリース版には入れないでね。
                            > #どのくらいの性能か調べてみてください。

                            客観的に性能を調べる術ってありますか?
                            自分でもfreeしないようにSetDataを書き直してみたんだけど、性能を調べたいんです。
                            #なんか自分のほうが遅いような気もする。
                            • [1318] Re7:画面がちらつく? みく 2002年01月24日 23:39


                              使用しているマシンに依存するから断言はできないですが。
                              私は素の状態のsakura.exeを起動してストップウォッチで30秒or60秒を測り、
                              以下のような操作を行いました。
                              ・文字キーを押しっぱなし
                              ・1000桁くらい入力しておいてDELを押しっぱなし
                              ・1000桁くらい入力しておいてBSを押しっぱなし
                              ・改行キーを押しっぱなし
                              で、一定時間で何文字・何行くらいになるかを調べる。
                              あとは、置換数の多いファイルで全置換(削除・挿入の繰り返しのはず)に何秒かかるかとか。

                              ソースを見て思ったのは削除・挿入時にいったんメモリを別に確保して
                              そちらにコピーし、最後にCMemoryにSetDataSzしていること。
                              この辺をCMemoryにやらせればメモリ転送が減るような気が...