Skip to content
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

improve image_finder speed by skipping mismatch label #1897

Merged
merged 2 commits into from
Jun 1, 2023

Conversation

kmuto
Copy link
Owner

@kmuto kmuto commented May 10, 2023

#1896 の手当てです。
#1895 もこれで直るかと思います( #1895 自体は入れてよさそうな気はします)。

  • base.rb: imagedirメソッドがプロジェクトフォルダ+config['imagedir'](つまりimages)を返していたのをやめて、config['imagedir']の結果だけを返すようにしました
  • image_finder.rb:
    • imagesフォルダを収集したときに、従来の完全なパス(path)のほか、拡張子を除いたもの(basename)、拡張子を小文字にしたもの(downcase)をハッシュで格納するようにしました
    • initializeをChapterオブジェクトをとるだけにしました。Chapterオブジェクトがあれば組み立てられるのと、拡張子候補のextsはinitialize時点ではビルド固有(builder_init_file)設定が呼び出されていなくて適切化されていないためです
    • イメージパスの先頭の「./」を除くようにしました。比較のときにここで厄介なことになっていたので…(そのため、厳密には結果互換性は失われます)
    • 発見ロジックで、まず拡張子を除いたパスターゲット(target)に一致するものをまずエントリ一覧から収集し、そもそも存在しなければその瞬間に次のパスターゲット試行にいく、存在したら拡張子試行をしてみる、というようにしました。これにより無駄な試行が大幅に削減されて高速化します。また、これまでinitializeで行っていた拡張子候補取得をここでやる(@book.image_types)ようにしたので、ビルダ固有のものが使われるようになりました
  • index.rb: image_finder.rbのinitialize変更との同期

#1896 で報告される以前でも2000個くらいの画像を喰わせてみたときには止まってしまっていたのですが、このPRの適用では数秒で解決できています。
ただ、そこそこ広めに影響しそうなパッチなので、一応レビューいただければと思います。

@kmuto kmuto requested review from takahashim and kdmsnr May 10, 2023 15:10
@kdmsnr
Copy link
Collaborator

kdmsnr commented May 15, 2023

よさそうに思いました。

entry_objectはテストがあるとよさそうです:

  def test_entry_object
    assert_equal({:basename=>"ch01/Foo", :downcase=>"ch01/Foo.jpg", :path=>"ch01/Foo.JPG"},
                 finder.entry_object("ch01/Foo.JPG"))
  end

@kmuto kmuto merged commit d734468 into master Jun 1, 2023
@kmuto kmuto deleted the improve-imagefinder branch June 1, 2023 14:17
@Nyoho
Copy link

Nyoho commented Jun 1, 2023

ありがとうございました。

#1896 からだと圧倒的に高速ですが、その前の v5.7.0 時点と比較してみました。

手元のプロジェクトのrake epubで簡単な(雑な)計測をしてみたところ、user timeが 94.0 % ぐらいになりました。(-6.0%)

usr time 22.56 秒 (tag v5.7.0 時点)
usr time 21.20 秒 (この時点)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants