V6.84β9No.03637
秀まるお2 さん 18/07/09 13:53
 
 秀丸メールのVersion 6.84β9をアップロードしました。

32bit版:
https://hide.maruo.co.jp/software/bin3/hmmail684b9_signed.exe

64bit版:
https://hide.maruo.co.jp/software/bin3/hmmail684b9_x64_signed.exe

 ながまるさんの所で2秒ほど固まるのはこれで直ってるはずだと思うんですが、同
じ環境の再現は出来てないので、果たしてどうか、テストお願いしたいです。

 あと、別件で、メールで連絡いただいたバグ修正の関係で、メールのデコードの処
理をいろいろいじってます。レベルダウンの無いように慎重に直したつもりですが、
一応手が入ってるので、その辺よろしくお願いします。

[ ]
RE:03637 V6.84β9No.03638
秀まるお2 さん 18/07/09 14:07
 
 ちなみにこちらで10万通サーバーに置いてテストしました。

 前回別スレッドにした処理は、0.06秒、今回別スレッドにした処理も0.06秒程度し
かこちらではかかってなかったりします。

 なんで2秒もかかるのか・・・。

 dump.txt取ると、

13:55:20.598 R ...(3922337バイト)
13:55:20.629 (9611) UIDL解析中...
13:55:20.692 (8850) will Recv_UpdateRemoteMailAtStartRetr
13:55:20.786 (8917) done Recv_UpdateRemoteMailAtStartRetr
13:55:20.786 (9611) UIDL解析(2)
13:55:20.848 (8703) Progress 0 = 0/0

 みたいに出るんですが、「UIDL解析中...」とその次が今回別スレッドにした処理
の時間で、UIDL解析(2)とその次が前回別スレッドにした処理時間になります。間に
リモートメールの更新に関わる処理があるんですが、ここは別スレッドに出来ずで、
そこに0.09秒ほどかかってたりします。

 相変わらずダメでしたら、この辺のログ教えて欲しいです。

[ ]
RE:03638 V6.84β9No.03651
ながまる さん 18/07/11 20:05
 
6.84β9 で確認したところ、 2秒 固まる部分も治っており、
受信中に固まることを体感しなくなりました!

これにより、私が感じていた不都合は解消されました。
ありがとうございます!


> ちなみにこちらで10万通サーバーに置いてテストしました。
>  前回別スレッドにした処理は、0.06秒、今回別スレッドにした処理も0.06秒程度
>しかこちらではかかってなかったりします。
> なんで2秒もかかるのか・・・。
>
想像ですが、 UIDL.bin の並びと UIDL コマンドでダウンロードした UniqueId の並
びの問題ではないかと思うのですよね。

Office 365 の Exchange Online を使っているのですが、 Exchange Online の Uniq
ueId は 十進数の数値で表され、 UIDL コマンドでは十進数値としてソートされた状
態で取得されます。
一方 UIDL.bin のほうは 受信するたびに先頭に受信した順番に UID が追記されるよ
うですが、そのせいで頻繁にメールを受信する環境では UIDL.bin 内の UIDL の並び
順がきれいになりません。

例えば、 10分毎の定期受信で 3通ずつ メールを受信する場合、
UIDL コマンドで取得した UIDL は
先頭← ..., 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009 →末尾
と並びますが、 UIDL.bin では、
先頭← 1007, 1008, 1009, 1004, 1005, 1006, 1001, 1002, 1003, 1000, ... →末尾
と並んでしまいます。


> Version 6.76の時に、その比較の処理を、新旧のUIDLでの並び順が似ているという
>か、1日単位で見た場合はほぼ同じであることを利用して高速化
>
これがどのような処理なのか想像してみたのですが、 上記の Exchange Online の U
ID と UIDL.bin 記録の仕様の組み合わせと、この高速化の処理の仕様の相性が悪い
のかもしれません。


dump.txt のログを出力する設定にしてみましたが、 UIDL解析中 (1) と (2) がそれ
ぞれ 2.5秒 ずつほどかかっていました。

12:10:24.227 R ...(3173315バイト)
12:10:24.227 (9611) UIDL解析中...
12:10:24.227 (10799) UIDL解析中...
12:10:26.549 (8850) will Recv_UpdateRemoteMailAtStartRetr
12:10:26.565 (8917) done Recv_UpdateRemoteMailAtStartRetr
12:10:26.565 (9611) UIDL解析(2)
12:10:26.565 (10799) (2)
12:10:29.149 (9611) 0 / 5 済み (0K / 309Kバイト)


試しに、 UIDL.bin を 以下のような PowerShell コードで、 日付ごとに UID が降
順になるように書き換えてみたところ、 30ms 程度とそれこそ劇的に早くなりました。

$uidl = Get-Content UIDL.bin -Encoding Ascii;
$list = New-Object 'System.Collections.Generic.List[uint64]';
$key = '';
$uidl | %{ if ($_ -match '^\*') { if ($key -ne '') { Write-Output $key; } $l
ist | Sort-Object -Descending | Write-Output; $key = $_; $list.Clear() } els
e { $list.Add([uint64]$_) } } -End { Write-Output $key; $list | Sort-Object
-Descending | Write-Output; } | Set-Content UIDL2.bin -Encoding Ascii;

12:15:44.942 R ...(3173660バイト)
12:15:44.958 (9611) UIDL解析中...
12:15:44.958 (10799) UIDL解析中...
12:15:44.975 (8850) will Recv_UpdateRemoteMailAtStartRetr
12:15:44.992 (8917) done Recv_UpdateRemoteMailAtStartRetr
12:15:44.992 (9611) UIDL解析(2)
12:15:44.992 (10799) (2)
12:15:45.024 (9611) 0 / 20 済み (0K / 1168Kバイト)


今後受信するメールについては、 メールを受信する順番と UIDL.bin に追記する順
番を逆にすることで、 低速になってしまうことを回避できるのではないかと想像し
ます。

Exchange Online は UIDL の順番がわかるので上記のような書き換えが可能でしたが、
 汎用的に考えると UIDL の文字列からその順番を求めることはできないため、すで
に受信してしまったものを救う上手な手立ては思いつきません。
… UIDLの解析に時間がかかっている環境の場合、 1度だけ 「UIDL.bin の整理」 と
して、 UIDL.bin の日付ごとの並びを UIDL で取得した順番の逆順になるように書き
換えてみるとか…?うーむ。。。


もし、 UIDL.bin や UIDL コマンドの結果があるとより検証しやすいのであれば、
公開フォーラムおくのはちょっと憚られるものの、直接メールでお送りいたします。

[ ]
RE:03651 V6.84β9No.03652
ながまる さん 18/07/11 20:09
 
# そもそも、今までこのような改善要望が上がらなかったということは、私とおんな
じような問題に陥る状況は相当ニッチで、ほとんどいないのだろうか…
# そこそこありがちな状況だと思うんですがね…?

[ ]
RE:03652 V6.84β9No.03653
秀まるお2 さん 18/07/12 09:45
 
 遅い原因を考察していただいてありがとうございます。僕の方でテストしたのは大
量のメールをまとめて受信して生成されたUIDL.binファイルでの話なので、毎日こつ
こつ受信した場合だと遅くなってしまうということで、了解しました。

> … UIDLの解析に時間がかかっている環境の場合、 1度だけ 「UIDL.bin の整理」
>として、 UIDL.bin の日付ごとの並びを UIDL で取得した順番の逆順になるように
>書き換えてみるとか…?うーむ。。。

 たぶんその方法で速くなると思います。

 並べ替える時に1回すごく時間がかかると思いますけど、2回目からは高速になる
と思います。

 他も、もうちょっと検索する順序のロジックを直して高速化は可能だと思います。
現状は、「となりかどうか」で探して見つからなければ全体の先頭から探すようにな
ってるんですが、せめて、同じ日付の中とか、あるいは1日前とかを優先して探せば
全然高速になると思います。

 テストデータは・・・、手元のUIDL.binファイルをあえてランダムにソートするな
どすれば出来ると思います。今度余裕のある時にやってみようと思います。

 ながまるさんのおかげでいろいろ高速化のネタや固まらなくするネタが分かったの
で大変助かりました。

 高速化といううことでは、今ちょうど、「スレッド的につながるメールも検索結果
に追加する」の高速化もやってる所ではあります。


[ ]
RE:03653 V6.84β9No.03682
秀まるお2 さん 18/07/18 18:28
 
 ながまるさん見てらっしゃるでしょうか。

 今さらのコメントですが、いくつか高速化のネタを反映しまして、以前よりも良く
なったような気がします。

 テストお願い出来るようでしたら、お返事お願いします。

■まずはテスト結果

>  テストデータは・・・、手元のUIDL.binファイルをあえてランダムにソートする
>などすれば出来ると思います。今度余裕のある時にやってみようと思います。

 10万通のメールで試してみたんですが、UIDL.binの中身をランダムに並べ替えし
てテストしたら、今まで0.06秒だったのが8秒くらいかかるようになりました。

14:52:26.514 (9611) UIDL解析中...
14:52:26.576 (8861) will Recv_UpdateRemoteMailAtStartRetr

 が、

14:55:50.774 (9611) UIDL解析中...
14:55:58.887 (8861) will Recv_UpdateRemoteMailAtStartRetr

 のようになりました。「UIDL解析(2)」の方も、だいだい0.06秒だったのが2秒くら
いに遅くなりました。

■高速ネタその1

 既存のUIDL.binファイルの中身をサーバー上と同じ順序に並べ替えるのは大変なの
で、とりあえず、新着メールの分からサーバー上と同じ並び順になるようにします。

 現状は、例えば

   *   2018/07/18
   00004
   00005
   00006
   *   2018/07/17
   00001
   00002
   00003

 のようになってる所に新しく00007を受信すると、

   *   2018/07/18
   00007
   00004
   00005
   00006
   *   2018/07/17
   00001
   00002
   00003

 のように先頭に挿入されてました。これを、00007の入れる位置を07/18の最後にし
て、

 *   2018/07/18
   00004
   00005
   00006
   00007
   *   2018/07/17
   00001
   00002
   00003

 のようにします。こうすると、1日単位で見たら、ほぼサーバーと同じ並び順にな
ります。

■高速ネタその2

 UIDLを検索する時に、直前にヒットした物のとなりにあれば超高速になるんですが、
そうでない場合、例えば1日に10通程度受信するなら、20通前から開始して下方
向に先に探すようにしました。それでヒットすると、「セミファースト」になるって
ことにしました。

 直前にヒットしたメールよりも20通前の範囲で見つかったら「SemiFast」、直前
にヒットしたメールよりも20通下の範囲で見つかったら「SemiSemiFast」としてカ
ウントします。どっちの範囲にも入らないとSlow扱い。見つからなければNotHitとな
ります。

■dump.txt出力

 UIDL解析が2段階あって、それぞれについて似たような処理をしていて、上記のヒ
ット具合をdump.txtに出力するようにしてみました。

 例えば僕のメインアカウントの、1週間程度サーバーに残す設定のアカウント
(サーバー上のメール数は500通程度)だと、

18:14:18.433 (9611) UIDL解析中...
18:14:18.433 (8998) will Recv_UpdateRemoteMailAtStartRetr
18:14:18.448 (9065) done Recv_UpdateRemoteMailAtStartRetr
18:14:18.448 (9611) UIDL解析中(2)
18:14:18.448 (7942) UidlConvAfter cLineOneDayMaybe=138 cHitFast=893 cHitReve
rse=13 cHitSemiFast=45 cHitSemiSemiFast=1 cHitSlow=19 cNotHit=87
18:14:18.448 (7951) UidlFast cHitFast=415 cHitSemiFast=40 cHitSemiSemiFast=0
 cHitSlow=24 cNotHit=11

 みたいな感じになりました。

 もしログ取っていただけるようでしたら、またβ版をアップロードしたいです。


[ ]
RE:03682 V6.84β9No.03691
ながまる さん 18/07/19 19:15
 
数日おきくらいにチェックさせてもらってきます

> もしログ取っていただけるようでしたら、またβ版をアップロードしたいです。
ご協力させていただきます!

[ ]
RE:03691 V6.84β9No.03700
秀まるお2 さん 18/07/20 10:36
 
 今アップロードしました。

 これで半分以下くらいには速くなっててくれてるんじゃないかと思います。

 毎日使い込んでいってUIDL.binファイルの中が整理されていけば、将来的にはもっ
と速くなるということで・・・。

 よろしくお願いします。

32bit版:
http://hide.maruo.co.jp/software/bin3/hmmail684b12_signed.exe

64bit版:
http://hide.maruo.co.jp/software/bin3/hmmail684b12_x64_signed.exe

 dump.txtには、

10:28:46.638 (7973) UidlConvAfter LineOneDayMaybe=194 HitFast=1174 HitRevers
e=13 HitSemiFast=37 SemiFastAverage=171 HitSemiSemiFast=2 Slow1=0 Slow2=30 N
otHit=87
10:28:46.638 (7986) UidlFast HitFast=549 HitReverse=13 HitSemiFast=57 SemiFa
stAverage=177 HitSemiSemiFast=0 Slow1=0 Slow2=9 NotHit=1

 みたいな記録が出ます。

 LineOneDayMaybe ... 1日に受信するメール数の予測を2倍した値
 HitFast         ...  UIDLが連続してて最高速になったケース。
 HitReverse      ...  UIDLが逆どなりでヒットしたケース。(高速)
 HitSemiFast     ...  LineOneDayMaybe分戻った位置から下方向に検索して高速ヒ
ットした数
 HitSemiSemiFast ...  SemiFastよりも少し下で、まぁまぁ高速ヒットした分
 Slow1           ...  LineOneDayMaybe分戻った位置から下方向にヒットして遅く
ヒットした数
 Slow2           ...  先頭まで戻って検索してヒットした、遅い数
 NotHit          ...  ヒットしなかった数(遅い)

 NotHitが多数出るのは、たぶん、UIDL.binから消してもいいかどうか(サーバーか
ら無くなってるけどまだファイル上に残すかどうか)の判定の分だと思います。

[ ]
RE:03700 V6.84β9No.03706
ながまる さん 18/07/20 22:22
 
試しました。

> 例えば、 10分毎の定期受信で 3通ずつ メールを受信する場合、
> UIDL コマンドで取得した UIDL は
> 先頭← ..., 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009 →末尾
> と並びますが、 UIDL.bin では、
> 先頭← 1007, 1008, 1009, 1004, 1005, 1006, 1001, 1002, 1003, 1000, ... →末尾
> と並んでしまいます。
>
こんな感じで、ある程度はグループになっていたからでしょう、
UIDL.bin がソートされていない (すなわち旧来の順序での UIDL.bin の) 状態でも
150ms 程度と、非常に早くなりました。


12:43:01.426 R ...(3251555バイト)
12:43:01.443 (9615) UIDL解析中...
12:43:01.443 (10799) UIDL解析中...
12:43:01.507 (9035) will Recv_UpdateRemoteMailAtStartRetr
12:43:01.522 (9102) done Recv_UpdateRemoteMailAtStartRetr
12:43:01.522 (9615) UIDL解析中(2)
12:43:01.522 (10799) (2)
12:43:01.601 (7973) UidlConvAfter LineOneDayMaybe=1978 HitFast=193180 HitRev
erse=4472 HitSemiFast=37416 SemiFastAverage=1967 HitSemiSemiFast=0 Slow1=0 S
low2=374 NotHit=7
12:43:01.601 (7986) UidlFast HitFast=184072 HitReverse=4472 HitSemiFast=3751
9 SemiFastAverage=1967 HitSemiSemiFast=2 Slow1=0 Slow2=267 NotHit=5
12:43:01.601 (9615) 0 / 2 済み (0K / 125Kバイト)


> LineOneDayMaybe=1978
>
非常識な値になってますが、実際のところ一日にこれぐらいメールを受信しています。
HitSemiFast の効果が大きそうですね。

[ ]
RE:03706 V6.84β9No.03708
秀まるお2 さん 18/07/21 09:12
 
 テストありがとうございます。いろいろ考えた作戦が成功してるということで、良
しとさせていただきます。

 ログ取りの処理も多少負荷のある処理なので、次回から外させていただきます。

[ ]