https://github.com/toyboot4e/lct-bench
https://github.com/toyboot4e/lct-bench
Last synced: 9 months ago
JSON representation
- Host: GitHub
- URL: https://github.com/toyboot4e/lct-bench
- Owner: toyboot4e
- Created: 2025-01-28T09:46:40.000Z (over 1 year ago)
- Default Branch: main
- Last Pushed: 2025-01-28T13:38:33.000Z (over 1 year ago)
- Last Synced: 2025-03-25T03:02:00.047Z (over 1 year ago)
- Language: C++
- Size: 31.3 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.org
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