2009-11-11 36 views
7

bazı işlevler OCaml uygulamak (örneğin, bir listeden harita) ancak OCaml kütüphanesinin haritası kullanılabilir gerçekten kolaydır: biz merak edebilir,OCaml modülleri ve performans

Ancak List.map hangi kod daha verimli olacak. Ayrı bir derleme biriminin (kitaplık) bir modülünü çağırmak, bazı olası en iyileştirmeleri geçersiz kılabilir. Fa.caml haber grubunu okudum kütüphanelerden fonksiyon çağırırken kapaklar kullanılır.

Genel programlama yapmak için Modüller ve Eğlence Programları kullanan üretimde OCaml kodu var. Tarihsel sebepten dolayı kodum monolitik: hepsi bir arada. Şimdi daha fazla zamanım var, kodu bu tür modüller için dosyalara ayırmaya istekliyim. Ancak, korkarım ki performansımı kaybedebilirim, çünkü bunu doğru yapmak için biraz zaman harcadım. Örneğin, karmaşık nesneleri sayılar ile sarmak için modüllerim var, bu yüzden benzersiz sunum ve hızlı karşılaştırmayı zorluyorum. Bu sarılı nesneleri genel Haritalar, Kümeler ile kullanıyorum ve üzerlerine önbellekler yapıyorum.

soru vardır: Ben dosyalarını ayırmak için taşırsanız

  • mıyım performansı gevşek olacak?
  • OCaml, modüller, functor'lar vb. Ile dolu kodumda birçok optimizasyon yapıyor mu?

C++ 'da, sınıf yöntemini bir .h olarak tanımlarsanız, derleyici kısa yöntemlere satır ekleyebilir, vb. Ayrılmış dosyaları kullanarak OCaml'de bunu başarmak mümkün müdür?

+0

Ocaml derleyici ve linker içersinde çok fazla bilgim yok, bu yüzden sorunuza cevap veremiyorum. Ancak, kodunuzu modüllere ayırmaktan herhangi bir performans kaybettiyseniz çok şaşırırım. Birkaç milisaniye kaybetmiş olsanız bile, kodunuzun artan netliği de buna değecektir. –

+0

C/C++ 'da bu büyük bir değişikliğe neden olabilir. Milyonlarca nesneye sahibim, milyonlarca kez eriştim/karşılaştırdım. Her bir erişim için bir dizi referans referansı çok kötü olabilir. – hectorpal

+0

Evet, ancak derleyici bu referansları satır içi olarak göstermelidir, böylece gerekli olandan daha fazla arama yapmazsınız. Bir sürü sahte modülden bir test projesi yapmaya çalışıp, onları koparmakla aynı dosyada tutmak arasında bir fark olup olmadığını ölçmeye çalışın. Çalışma kod tabanınızı yeniden düzenlemekten çok daha az iş olabilir. Umarım bu, akıllı telefonun kodunuzu akıllıca optimize edebileceği konusunda size biraz daha güven verecektir. –

cevap

9

Bazı performansları kaybedebilirsiniz. Ancak, iki hafifletici faktörler vardır:

  • kod birkaç uyarılar ile (hatta ayrı derleme birimlerinde satır içine yerleştirilmiş mümkün yani OCaml yerel kod derleyici, çapraz modül inlining yapabilirsiniz - özyinelemeli fonksiyonlar ve işlev argümanları [1] modülleri arasında satır içi değil). Bu kod yine de yeterince hızlı olabilir ve okunabilirlik ve süreklilikteki kazançlar büyük olasılıkla herhangi bir (marjinal) performans maliyetinden ağır basacaktır.

OCaml, aynı kaynak dosyasında funktörlerin tanımlandığı kodun defunctorizes olup olmadığını bilmiyorum. Aksi takdirde, modüller, tekrarlayıcılar tarafından meydana gelmiş olan herhangi bir performans artışı eklememelidir. Genel olarak, benim düşüncem doğru, okunabilir, sürdürülebilir bir kod yazmak ve kodun pratikte çok yavaş olmadığı sürece mikroskobik performans özellikleri hakkında çok fazla endişe etmemek en iyisidir.

+0

Teşekkürler Michael. Iyi bilgi.Tabi ki okunabilirliği kazanacağımı biliyorum. Şu an sahip olduğum şey tatmin edici değil. Ancak, benim durumumda çalışma zamanı performansı kritik bir konudur. Listeden diziye geçmeye çok zaman harcadım (şimdi dizileri büyütmek için Res kütüphanesini kullanıyorum). Ayrıca tonlarca önbellek var ve veri yapısını dikkatle seçiyorum. Sanırım yaptığım şeyi yaparak 10 dakikadan az ya da en kötü 10 saniyeye indiğimi düşünüyorum. Benim endişem şu anda, milyonlarca nesnenin temsilini sarmalayan modüller hakkında. Yine de ayrılacağım, ama bu etkiyi test etmem gerekiyor ve herkesi bölmeyebilir. – hectorpal

+0

kodu yeniden kodlama işlemini tamamladıktan sonra, bazı modülleri gerektiğinde ana dosyaya seçici olarak geri almak nispeten kolay olmalıdır. –