2011-11-01 23 views
14

我想了解更多關於Perl執行的幕後優化的信息。如何以及在哪裏可以瞭解更多關於Perl優化器的信息?

一個例子是優化治療reverse sort { $a <=> $b } @array;sort { $b <=> $a } @array;

它看起來像好醇」 perldocdoesn't have anything on this subject


幾個問題在這裏:

  1. 在沒有perldoc,什麼是瞭解這種優化的官方資源?

  2. perldoc沒有記錄這些優化的原因嗎?

  3. 還有哪些其他常見的優化?

+0

不知道爲什麼,有沒有關於這個問題的多文檔,但由於編譯器是開源的,你可以檢查代碼並親自看到優化。 – Polynomial

+9

實現細節不屬於perldoc,因爲即使語言的基本行爲不會改變,它們也可以更改。這些細節通常很有趣,但是perl文檔已經太大了。 – mob

+1

我同意這樣的事情可能會很好。正如暴徒所說,問題在於他們可能會改變。我知道另一個不錯的優化是標量上下文中的'map'不會生成返回數組(這會被忽略)。這些東西很好理解,無需一路收集,至少對於常見的習慣用法和通用優化。 –

回答

9

對於這樣的事情,您可能會發現文檔中的小部分(尤其是那些處理C api的),但大部分都在C源代碼本身。

對於sort,我相信相關的功能是S_simplify_sort in op.c

優化的核心是在Perl_peep in the same file。任何人想要了解更多有關Perl是如何運作可以通過閱讀他們,從perl5004delta獲得一些見解 -

8

一些它在perldeltas記錄。其中一些在代碼中有相當好的評論,當然RTFS是另一種學習方式。開始查看源代碼的地方的一個很好的來源是the section "Compiled Code" of perlguts,另一個值得一讀的文檔。

第18章「編譯」中記錄了一些但並非全部的內容Programming Perl(是的,第3版確實是10歲,涵蓋5.6.0和/或5.6.1,但是the 4th edition終於在工作!)

但是,它的很多,但是,除了可能的郵件列表線程正在討論的功能,而它正在開發時記錄。如果您有興趣瞭解關於perl內部的更多信息,並且可能對文檔有所貢獻,我會建議您在perl5-porters mailing list#p5p IRC channel上提出問題,因爲這是大部分perl-guts部落知識所在。

+0

當然,你也可以把你得到的任何答案都送回StackOverflow - 或者賄賂人們,直接在SO上發佈它們:) – hobbs

+0

其實我想爲這個問題提供一個獎勵,以便那些與答案可以倒在他們的知識:) – Zaid

1

我懷疑使用沒有任何比較sub {}的內置排序是最快的。

因此,如果您使用自定義子{}來鼓勵反向排序,它會放慢速度。

我還認爲我已經讀過了,「反向排序」不再需要花費 - 編譯器會爲您排序,或者至少會比使用自定義子快速反轉結果快。

的「在高效Perl的排序重新審視」這個舊的文章似乎有這些想法同意:

http://www.sysarch.com/Perl/sort_paper.html

+0

這並不回答這個大問題:我如何以及在哪裏可以瞭解更多關於Perl優化器?它只是重申優化器用「反向排序」做的事情,並提供關於它的鏈接。 – Zaid

1

如果你能得到的副本保持,可以用的描述應對它比當前的Perl稍舊(儘管其中的大部分內容並沒有多大變化),Extending and Embedding Perl這本書可能會有所幫助,它在內部,optrees和優化器的一些細節上都有章節。

儘管如其他人所建議的那樣,查看源代碼並使用適當的B模塊進行播放是最好的方法。

0

B::Deparse模塊可能會給一些有趣的事情:(出於某種原因,reverse優化沒有在這裏顯示)

$ perl -MO=Deparse -e 'reverse sort { $a <=> $b } @array' 
reverse +(sort {$a <=> $b} @array); 
-e syntax OK 

+0

這是一個問題,而不是答案 – Zaid

+0

對不起。我試圖給出一個關於使用'B :: Deparse'模塊作爲學習perl優化器的一些方法的提示。 – tuomassalo

+0

那麼如果'reverse'優化不在這裏顯示,我不確定'B:Deparse'對於這個問題的需求是多麼有用 – Zaid

相關問題