OpenLDK adlı Common Lisp JVM üzerinde Clojure çalıştırma girişimleri sırasında ciddi bir performans engeliyle karşılaşıldı. Clojure REPL'e ulaşmak neredeyse üç saat sürüyordu ve profil analizleri, bu sürenin büyük bir kısmının SBCL'in PCL uygulamasındaki invoke-special içinde, binlerce init() (JVM kurucu) metodu arasında gezinmekle geçtiğini gösterdi. Bu durumun temel nedeni, CLOS'un tüm argümanların tiplerini dikkate alan çoklu dağıtım (multi-method dispatch) modeli ile Java'nın yalnızca alıcı nesnenin tipini dikkate alan tekli dağıtım (single dispatch) modeli arasındaki uyumsuzluktur. OpenLDK, Java sınıflarını CLOS sınıflarına ve Java sanal metodlarını CLOS genel fonksiyonlarına eşlediği için, her Java metod çağrısı CLOS'un çoklu dağıtım protokolünün tüm maliyetini ödemek zorunda kalıyordu. Birkaç sınıf için bu fark edilmezken, Clojure'un başlangıçta yüklediği yaklaşık 3000 sınıf için bu durum bir felakete dönüştü.
SBCL'in PCL'i, MOP'un dağıtım protokolünü uygular ve genel bir fonksiyon çağrıldığında, çağrıyı bir ayırt edici fonksiyon (discriminating function - dfun) aracılığıyla yönlendirir. Dfun, daha önce görülen argüman tiplerine göre çağrıları hızlandırmaya çalışan bir önbellekleme yapısıdır. Önbellek isabet etmediğinde, PCL tam MOP protokolüne geri döner: compute-applicable-methods-using-classes her özel argümanın sınıfını tanımlanmış her metodun özelleyicileriyle karşılaştırır, eşleşen metodlar tüm argüman pozisyonları için özgüllüğe göre sıralanır ve PCL, call-next-method desteğiyle birincil ve yardımcı metodları birbirine bağlayan etkili bir metod oluşturur. Bu sonuç dfun'a geri katlanarak bir sonraki aynı tipteki çağrının hızlı olmasını sağlar. Ancak metod kümesi değiştiğinde (örneğin Clojure başlangıcında binlerce sınıf yüklenirken), PCL update-dfun'ı çağırarak ayırt edici ağı sıfırdan yeniden inşa eder. Bu, dfun'un asla stabilize olamamasına ve her yeniden inşa işleminin binlerce kez pahalıya mal olmasına neden olur.
Çözüm, CLOS Meta-Object Protocol'e müdahale ederek Java metodları için Java'nın dağıtım modeline uygun bir mekanizma ile değiştirmek oldu. Java'nın sanal dağıtımı basittir: alıcı nesnenin sınıfına bakılır, eşleşen bir metod bulunana kadar sınıf hiyerarşisinde yukarı çıkılır ve işlem tamamlanır. Diğer argüman tipleri dikkate alınmaz. Bu, alıcı sınıfına göre anahtarlanmış bir önbellek ile optimize edilmiş tekli dağıtımdır. Bu makalede, bu basit Java dağıtım modelini taklit eden java-generic-function meta-sınıfı kullanılarak bir çözüm geliştirildiği anlatılmaktadır. Bu sayede Clojure'un OpenLDK üzerindeki başlangıç performansı önemli ölçüde iyileştirilmiştir.
Bu çözüm, Lisp tabanlı sistemlerin Java sanal makinesi üzerinde yüksek performansla çalışabilmesi için kritik bir optimizasyon sunuyor.