参照リクエスト:事前に安全性チェックを実行して、動的言語のリストの手順を最適化する


7

science fairプロジェクトでは、Pythonのソートルーチンの最適化を実装しまし。アイデアは、各比較中に実行する必要がある安全性チェック(タイプチェックや文字幅チェックなど)をソートループの外に移動し、それらすべてを1つのパスで実行することです。次に、チェックの結果に基づいて、ポートフォリオから最適化された比較関数が選択されます。したがって、たとえば、チェックですべてのオブジェクトが同じタイプであると判断された場合、選択された比較関数は、通常必要な「オブジェクトタイプの互換性がある」チェックをスキップできます。等。

私はこれを論文として書き上げる必要があり、現在文献レビューに取り組んでいます。他の動的言語/一般的に同様の手法を説明した論文はありますか?


2
これは直接の関連はありませんが、うまくいけば、潜在的に有用な方向性を示すのに役立ちます。これは、多くのJIT /動的コンパイラのインラインキャッシュを連想させます。そのアイデアは、プロパティ(たとえば、intのリスト、文字列のリスト、混合リストなど)によってインデックスが付けられたバケットに「ホット」になる可能性のあるトレースをプロファイルすることです。これらのバケットが与えられると、各プロパティセットに最適化されたコードを動的に生成し、それに応じてキャッシュします。その結果、ジャストインタイムの文献には、多かれ少なかれ金型に適合するかなりの数の最適化が含まれています。ハッピーリファレンスハンティング!
リー

1
@LeeGao「ホット」トレースがハードコードされていることを除いて、私がやっていることとまったく同じように聞こえます。動的に生成するのではなく、最適化されたトレースもハードコードします。この手法に適した調査用紙/ランドマーク用紙は何ですか?「JITバケット」をグーグルで試しましたが、何も見つかりませんでした:)
Elliot Gorokhovsky

1
「インラインキャッシング」を使用すると、いくつかの良い結果が得られます。「バケット」は、友人や同僚に説明しようとするときに使う言葉です。:P
Lee

@LeeGao :)うん、ありがとう。私が今やっていることは、文字通り、インラインキャッシングとは何かということです。知っておきたい!
Elliot Gorokhovsky 2016年

回答:


7

私はこのような正確なことは何も知りませんが、間違いなく関連しているものがあります。

具体的に並べ替える場合、これはシュワルツ変換に関連していますが、目的は大きく異なります。シュワルツ変換では、高価な関数を適用して入力を実行し、入力と出力をペアにして、出力で並べ替えます。これは、各操作でその高価な機能を実行することとは対照的です。あなたの場合、あなたの「高価な機能」は、型チェックと動的ディスパッチです。少し違うのは、リスト全体のプロパティもチェックし、それに基づいて使用する比較演算を選択することです。

まったく異なる形で、ポリモーフィックインラインキャッシングと呼ばれる一般的な手法(Selfチームによって開拓され、とりわけCraig Chamberの論文で取り上げられています)と、一部の仮想マシンで使用されるより一般的な適応最適化があります。ポリモーフィックインラインキャッシングは、動的ディスパッチを行うと完全に不明なコードにジャンプするため、コードをインライン化して現在の関数を最適化できないという問題を解決します。解決策は簡単です。if特定のケースにいるかどうかをテストするためにを実行し、そうであれば、そのコードをインライン化できます。そうでない場合は、動的ディスパッチを実行します。問題は、可能性のあるケースが無限で未知の数であることです。しかし、これは問題ではありませんJust-In-Time(JIT)コンパイラーは、実行時に実際に見られるケースに対してこれを行うことができます。

動的ディスパッチは、「この配列のすべての要素が同じ型である」などの任意の述語ではなく、オブジェクトの実行時クラスに基づいているため、これで問題が解決することはありません。これは、適応最適化の出番であり、JITコンパイラのトレースなどです。。ループを数回アンロールしたり、2レベルの再帰をインライン化したりすると、単純な定数伝播スタイルの最適化によって多くの型チェックが排除され、場合によってはより高度な最適化によって完全に排除される可能性があります。それにもかかわらず、それはあなたが示唆していることと同じことをしないことがよくあり、ソート機能を使用するたびに最初にトレースを見る必要があります。一方、すべての要素が数値であることを知っている場合、たとえば以前のコードから、チェックを完全に排除できます。


実際には、インライン化される特別なケース比較関数(文字列、int、floatなど)がたくさんあるので、ポリモーフィックインラインキャッシングは非常に重要です。私のコードはこれらの特殊なケースを調べてチェックし、見つかった場合は、compare関数を特殊なケースに置き換えます。
Elliot Gorokhovsky 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.