An open API service indexing awesome lists of open source software.

https://github.com/toyboot4e/lct-bench


https://github.com/toyboot4e/lct-bench

Last synced: 9 months ago
JSON representation

Awesome Lists containing this project

README

          

* LCT 高速化

質問用のリポジトリです。

*追記: 回答を頂いた結果、 =splay=, =rotate= に ={-# INLINABLE #-}= を付けると =0.678= 秒まで高速化されました。* 今までの体感としては ={-# INLINABLE #-}= には効果が無かったのですが、 private な関数には効くのかもしれません (裏取り無し) 。ありがとうございました!!

** 質問内容

C++ ライブラリを写経してテスト問題 ([[https://judge.yosupo.jp/problem/dynamic_tree_vertex_add_path_sum][Dynamic Tree Vertex Add Path Sum]]) を解きました。 C++ の実行結果 (0.259 秒) に比べ、 Haskell の実行結果 (2.47 秒) が約 10 倍遅いです。 C++ の 2 ~ 4 倍程度まで高速化したいのですが、何か方法に心当たりがあれば教えてください。

- [[./hs/src/Lct.hs]]: link/cut tree の実装モジュールです。このソース中で高速化できる点があればお伺いしたいです。
- [[./hs/app/lct-test.hs]]: テスト問題の回答プログラムです。

=Lct.hs= は基本的に C++ 版の ([[./cpp/graph/ds/link_cut_tree.hpp]]) の写経です。データの持ち方が異なりますが、その他のソースはほぼ同一ですので、 Haskell ならではの低速化のポイントが無いか探しています。また追加で調べるべき情報などの指摘も頂けると幸いです。

- CPP 版のデータの持ち方: =std::vector= (array of structs)
- Haskell 版のデータの持ち方: =VU.Vector Int=, =VU.Vector Int=, =VU.Vector Int=, .. (struct of arrays)

** 環境構築

Linux の Nix (Flakes) ユーザは =direnv allow= で環境構築できると思います。

他の環境はセットアップできておりません。ご了承ください。

** テストの実行方法

[[https://github.com/casey/just][=just=]] (タスクランナー) で実行します。

*** C++ 版のテスト実行

#+CAPTION: 実行コマンド
#+BEGIN_SRC sh
$ just cpp
#+END_SRC

#+CAPTION: 実行結果
#+BEGIN_SRC txt
[INFO] slowest: 0.259401 sec (for max_random_02)
[INFO] max memory: 17.440000 MB (for max_random_00)
[SUCCESS] test success: 12 cases
#+END_SRC

*** Haskell 版のテスト実行

#+CAPTION: 実行コマンド
#+BEGIN_SRC sh
$ just hs
#+END_SRC

#+CAPTION: 実行結果
#+BEGIN_SRC txt
[INFO] slowest: 2.473940 sec (for max_random_00)
[INFO] max memory: 42.720000 MB (for max_random_01)
[SUCCESS] test success: 12 cases
WARNING:onlinejudge_verify.languages.user_defined:The functionality to list dependencies of .hs file is not implemented yet.
#+END_SRC

#+BEGIN_QUOTE
Haskell の入力処理は 0.109 秒でしたので、やはり LCT の計算部分が重いようです。
#+END_QUOTE