萌えハッカーニュースリーダー

2025/07/25 19:28 Stackless Traversal (2018)

出典: https://www.dyalog.com/blog/2018/01/stackless-traversal/
hakase
博士

ロボ子、今日のニュースはDyalog APLのEnlist関数(∊)がめっちゃ速くなったって話じゃ。

roboko
ロボ子

Enlist関数ですか。知りませんでした。具体的にどれくらい速くなったんですか?

hakase
博士

Dyalog 16.0では、Dyalog 15.0に比べて2倍も速くなったらしいぞ!特に、ネストされた配列で、内部の単純な配列が比較的小さい場合に、パフォーマンスが大きく改善されるみたいじゃな。

roboko
ロボ子

それはすごいですね!でも、どうやってそんなに高速化したんですか?

hakase
博士

最初はC言語で再帰関数を使って実装しようとしたらしいんじゃ。でも、深いネストの配列だとCスタックのサイズ制限でsegfault(セグメンテーション違反)が起きる可能性があるから、諦めたみたい。

roboko
ロボ子

なるほど、スタックオーバーフローの危険性があるんですね。それで、どうしたんですか?

hakase
博士

今までの`trav()`関数は汎用的だけど遅くて、メモリを大量に消費し、不要なオプションチェックに時間を使ってたらしい。そこで、新しいアプローチでは、Cスタックの代わりにワークスペースを使うことにしたんじゃ。

roboko
ロボ子

ワークスペースですか。具体的にはどのように?

hakase
博士

ポインタ操作を駆使して配列をトラバースするんじゃ。ポインタの指すアドレスの下位2ビットをトラバース中に利用して、停止ビットや配列の長さなどを格納するらしいぞ。賢い!

roboko
ロボ子

ポインタの下位ビットを使うんですか!そんなテクニックがあるんですね。でも、トラバース中にメモリ管理機能の呼び出しが安全ではないってどういうことですか?

hakase
博士

トラバース中はメモリの状態が予測できないから、メモリ確保や解放をすると、データが壊れたり、プログラムがクラッシュしたりする可能性があるんじゃ。だから、事前に必要なメモリを確保しておく必要があるってわけ。

roboko
ロボ子

なるほど、事前にメモリを確保しておくことで、安全性を確保するんですね。新しいアルゴリズムは、配列のハッシュ処理にも使われているんですか?

hakase
博士

そうなんじゃ!新しいアルゴリズムは、配列のハッシュ処理にも使われていて、ダイアディックイオタや関連機能の高速化に貢献しているらしいぞ。

roboko
ロボ子

Enlist関数の高速化が、他の機能にも影響を与えているんですね。具体的にどれくらい速くなったんですか?

hakase
博士

10グループに分割された1e3バイトの配列の場合、速度は2.118倍に向上、1e4バイトだと1.244倍、1e5バイトだと1.077倍じゃ。10段階にネストされた1e4バイトの配列だと2.466倍、1000段階のネストだと6.730倍、重複した参照だと4.584倍速くなったらしい。

roboko
ロボ子

すごい改善ですね!特に深いネストや重複した参照がある場合に効果が大きいんですね。

hakase
博士

そういうことじゃ。Dyalog APL、ますます便利になるのじゃ!

roboko
ロボ子

私ももっとDyalog APLを勉強して、使いこなせるようになりたいです!

hakase
博士

よし、ロボ子。今度、Dyalog APLで迷路を解くプログラムでも作ってみるかの?出口は…笑顔じゃ!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search