Python'un (ve diğer dinamik dillerin) hangi anlamsal özellikleri yavaşlığına katkıda bulunur?


26

Çok iyi tanımıyorum Python. Dinamik dillerin (à la Python, Lua, Scheme, Perl, Ruby, ...) tam özelliklerinin uygulamalarını yavaşlatmaya zorladığını daha kesin olarak anlamaya çalışıyorum.

Bir nokta olarak, Lua 5.3 metatable makineleri sezgisel olarak Lua'yı yavaşlatır, ancak pratikte Lua'nın oldukça hızlı olduğu söylenir (ve Python'dan daha hızlıdır).

Ayrıca, şimdiki işlemciler üzerinde beri bellek çok daha yavaş ham hesaplama daha olduğunu sezgi (belki bir yanlış bir) sahip à la, dinamik tip kontrolü ((bir önbellek ile bir bellek erişimi aritmetik işlemlerin yüzlerce aynı zamana ihtiyacı) if (value->type != INTEGER_TAG) return;içinde C parlance) oldukça hızlı koşabilir.

Elbette, bütün program analizi ( Stalin Scheme uygulaması yaptığı gibi), bir tercüman hızlı çalışırken dinamik bir dil uygulaması yapabilir, ancak ilk önce bir program analizörü tasarlamak için zamanım yokmuş gibi yapalım.

( MELT monitörümde dinamik bir dil tasarlıyorum ve bazıları C'ye çevrilecek )



1
Bazı Lua programlarının neden yavaş olduğunu ve nasıl düzeltileceğini açıklayan Lua Performance Tips .
Robert Harvey,

Yanıtlar:


24

Python'un (ve diğer dinamik dillerin) hangi anlamsal özellikleri yavaşlığına katkıda bulunur?

Yok.

Dil uygulamalarının performansı, dil özelliklerinin değil, paranın, kaynakların ve doktora tezlerinin bir işlevidir. Öz , Smalltalk'ten çok daha dinamiktir ve Python, Ruby, ECMAScript veya Lua'dan biraz daha dinamiktir ve mevcut tüm Lisp ve Smalltalk VM'lerinden daha iyi performans gösteren bir sanal makineye sahipti (aslında, Öz Özçekim, Öz ve hatta bu, mevcut Smalltalk VM'lerin çoğundan daha hızlıydı) ve zamanın C ++ uygulamalarından daha rekabetçi ve hatta bazen daha hızlıydı.

Daha sonra Sun, Self'i finanse etmeyi bıraktı ve IBM, Microsoft, Intel ve Co. C ++ 'ı finanse etmeye başladı ve trend tersine döndü. Öz geliştiriciler, kendi şirketlerini kurmak için Sun'ı terk ettiler; Self VM için geliştirilen teknolojiyi şimdiye kadarki en hızlı Smalltalk VM'lerden (Animorphic VM) biri haline getirdiler ve ardından Sun bu şirketi geri aldı ve biraz değiştirilmiş versiyonu bu Smalltalk VM şimdi "HotSpot JVM" adı altında daha iyi bilinmektedir. İronik olarak, Java programcıları, aslında Java olduğunda "yavaş" olduğu için dinamik dilleri araştırıyorDinamik dil teknolojisini kabul edinceye kadar yavaştı. (Evet, doğru: HotSpot JVM aslında bir Smalltalk VM'dir. Bayt kodu doğrulayıcısı çok fazla türde kontrol yapar, ancak bayt kodu doğrulayıcı tarafından kabul edildiğinde, VM ve özellikle optimize edici ve JIT aslında yapmaz. Statik tipleri ile çok ilgi!)

CPython, dinamik dilleri (ya da daha doğrusu dinamik gönderimi) hızlı kılan şeylerin çoğunu yapmaz: dinamik derleme (JIT), dinamik optimizasyon, spekülatif satır içi, uyarlamalı optimizasyon, dinamik optimizasyon, dinamik tip geri besleme / çıkarım. Ayrıca hemen hemen tüm çekirdeğin ve standart kütüphanenin C dilinde yazılması sorunu da var; bu, Python 100x’i birdenbire daha hızlı yapsanız bile, size çok yardımcı olmayacaktır, çünkü Python programı, Python değil C'dir. Her şey Python'da yazılmış olsaydı, ılımlı hızlanmalar bile, algoritmaların daha hızlı, çekirdek veri yapılarının daha hızlı hale geldiği çığ gibi bir etki yaratırdı, ama elbette, çekirdek veri yapıları da algoritmalar ve çekirdek algoritmalar ve çekirdek verileri içinde kullanılıyordu. yapılar başka her yerde kullanılır,

Bugünün sistemlerinde bellek tarafından yönetilen OO dilleri (dinamik olsun ya da olmasın) için kötü bir şekilde kötü olan birkaç şey var. Sanal Bellek ve Bellek Koruması, özellikle çöp toplama performansı ve genel olarak sistem performansı için bir katil olabilir. Ve güvenli bir dilde tamamen gereksiz: dilde başlangıçta herhangi bir hafıza erişimi olmadığında neden yasadışı hafıza erişimine karşı koruma sağlanıyor? Azul, modern güçlü MMU'ları (Intel Nehalem ve daha yenisi ve AMD'nin eşdeğeri) engellemek yerine çöp toplama işlemine yardımcı olduğunu düşündü , ancak CPU tarafından desteklense de, ana işletim sisteminin işletim sistemindeki mevcut bellek alt sistemleri yeterince güçlü değil Buna izin vermek (Azul'un JVM'sinin çıplak metalinde sanallaştırılmış çalışmasının nedeni budur) yanında işletim sistemi, içinde değil).

Singularity OS projesinde, Microsoft, işlem ayırma için tip sistem yerine MMU koruması kullanıldığında, sistem performansında ~% 30'luk bir etki ölçmüştür.

Azul, uzman Java işlemcilerini oluştururken fark ettiği başka bir şey, modern ana işlemcilerin, önbellek özlüyor maliyetlerini azaltmaya çalışırken tamamen yanlış olan şeye odaklanmalarıydı: şube tahmini, bellek önyükleme gibi şeyler yoluyla önbellek özlüyor sayısını azaltmaya çalışıyorlar. ve bunun gibi. Ancak, ağır polimorfik bir OO programında, erişim kalıpları temel olarak sahte rastgeledir, tahmin etmek için hiçbir şey yoktur. Bu yüzden, bu transistörlerin tümü tamamen boşa harcanmıştır ve bunun yerine yapılması gereken, her önbellek kaçırma maliyetini düşürmektir. (Toplam maliyet #misses * maliyettir, ana akım ilk sırayı indirmeye çalışır, ikinci Azul'dur.) Azul'un Java Bilgi İşlem Hızlandırıcıları uçuşta 20000 eşzamanlı önbellek özeti çekebilir ve hala ilerleme kaydedebilir.

Azul başladığında, onlar düşünce bazı off-the-raf I / O bileşenleri almak ve kendi özel CPU çekirdek tasarımı olacaktır, ama ne onlar aslında sona erdi gerek yapmak tam tersi oldu: onlar oldukça standart amansız aldı raf 3 adresli RISC çekirdeği ve kendi bellek denetleyicisi, MMU ve önbellek alt sistemini tasarladı.

tl; dr : Python'un "yavaşlığı" dilin bir özelliği değildir, ancak a) saf (birincil) uygulaması ve b) modern CPU'ların ve işletim sistemlerinin C'nin hızlı çalışmasını sağlamak için özel olarak tasarlandıkları ve özellikleri C için ya yardım etmiyor (önbellek) ya da aktif olarak zarar veren (sanal bellek) Python performansı var.

Buraya dinamik geçici polimorfizm ile hemen hemen hafıza ile yönetilen herhangi bir dili ekleyebilirsiniz… verimli bir uygulamanın zorlukları söz konusu olduğunda, Python ve Java bile “hemen hemen aynı dildir”.


Azul için bir bağlantınız veya referansınız var mı?
Basile Starynkevitch,

4
Bir dilin anlambiliminin, verimli bir şekilde uygulanabilmesi üzerinde bir etkisi olmadığı konusunda hemfikirim . Evet, birinci sınıf optimizasyonlara ve analizlere sahip iyi bir JIT uygulaması , bir dilin performansında büyük bir gelişme sağlayabilir , ancak sonuçta, semantikanın kaçınılmaz bir şekilde tıkanıklıklara neden olacak bazı yönleri vardır. Göstergelerin kesin olarak örtülmesinin C'nin gerekliliği ya da işlemleri listelemek için Python'un gerekliliği yerine getirilmesi gerekliliği, bazı uygulamaların performansının önlenmesinde kaçınılmaz olarak sonuçlanan bazı anlamsal kararlar vardır.
Jules

1
Bir kenara ... Singularity'deki% 30 iyileşme için referansınız var mı? Uzun yıllardır dil tabanlı koruma işletim sistemlerinin savunucusu oldum, ancak bu rakamı daha önce hiç görmedim ve oldukça şaşırtıcı buldum (geçmişte baktığım rakamlar% 10'a yakındı) ve ne olduğunu merak ettim. bu kadar iyileşme elde ettiler ...
Jules

5
@MasonWheeler: Çünkü orada sadece berbat Python uygulamaları var. Hiçbir Python uygulayıcısı, IBM, Sun, Oracle, Google ve Co.’nun J9, JRockit, HotSpot ve Co’ya harcadığı para, insan, araştırma ve kaynakların bile çok küçük bir kısmını harcamıştır. iş gücüne Oracle'ın sadece çöp toplayıcıya harcadığı gücü verin. IBM, Eclipse OMR (J9'dan çıkarılan parçalanmış açık kaynaklı VM çerçevesi) temelli bir Python uygulaması üzerinde çalışıyor, performansının J9
Jörg W Mittag

2
Çünkü C rekoru , sayısal iş için Fortran'la karşılaştırıldığında yavaştır, çünkü Fortran sıkı takma işlemini zorlar, böylece optimizer daha agresif olabilir.
Michael Shopsin,

8

Python'un şu anki uygulaması (diğer dinamik dillerin, örneğin modern Javascript uygulamalarının ve sizin de belirttiğiniz gibi, Lua'nın yaptığı pek çok optimizasyondan yoksun olan) Lua'nın, problemlerinin çoğunun kaynağı olduğu, bunu yaparken de bazı anlamsal meseleleri var. Bir uygulamanın, en azından belirli alanlarda, diğer dillerle rekabet etmesi zor. Özellikle dikkate değer olan bazıları:

  • Liste ve sözlük işlemleri, dil tanımının atomik olması için gereklidir. Bu, bir JIT derleyicisi bir liste nesnesine hiçbir referansın mevcut iş parçacığından (birçok durumda zor olmayan ve genel durumda imkansız olan bir analiz) kaçmadığını ispatlayamazsa, nesneye erişimin seri hale getirilmesi gerektiğini (örn. kilitleme yoluyla). CPython uygulaması, Python kodunun çok işlemeli ortamlarda çok iş parçacıklı tekniklerle etkin bir şekilde kullanılmasını önleyen meşhur "global tercüman kilidini" kullanarak çözüyor ve diğer çözümlerin hepsinde performans sorunları var.

  • Python'un, değer nesnelerinin kullanımını belirleme mekanizması yoktur; Her şey referans olarak ele alınmaktadır, zorunlu olarak gerekmediği durumlarda ekstra bir aktarım eklenmektedir. Bir JIT derleyicisinin bazı durumlarda değer nesnelerini ortaya çıkarması ve bunu otomatik olarak optimize etmesi mümkün olsa da, genel olarak yapmak mümkün değildir ve bu nedenle optimizasyonun mümkün olması için dikkatlice yazılmayan bir kod (bu da siyah bir sanattır) acı çekecek.

  • Python'un bir evalişlevi vardır; bu, bir JIT derleyicisinin, bir evalkez kullanıldığı sürece tüm program analizini gerçekleştirse bile gerçekleşmeyen eylemler hakkında varsayımlarda bulunamayacağı anlamına gelir . Örneğin, bir Python derleyicisi bir sınıfın alt sınıfları olmadığını varsaymaz ve bu nedenle yöntem çağrıları devirtualize eder, çünkü bu varsayım daha sonra yapılan bir çağrı ile reddedilebilir eval. Bunun yerine, yerel derlenmiş kod tarafından yapılan varsayımların, bu kodun yürütülmesinden önce geçersiz kılınmamasını sağlamak için dinamik tip kontrolleri yapması gerekir.


3
İkinci nokta, evalbir yeniden derleme ve / veya optimizasyonun tetiklenmesiyle hafifletilebilir .
Jörg W Mittag

4
Bu arada, bu da Python'a özgü değil. Java (veya daha doğrusu JVM) dinamik kod yükleme ve dinamik bağlantıya sahiptir, bu nedenle Sınıf Hiyerarşi Analizi, orada Halting Problemini çözmeye eşdeğerdir. Ancak, HotSpot mutlu bir şekilde spekülatif olarak polimorfik yöntemleri sıralar ve sınıf hiyerarşisindeki bir şey değişirse, bu onları geri çeker.
Jörg W Mittag
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.