2016-03-09 66 views
2

我需要爲ListView/GridView生成大量對象列表。據我所知,這些對象必須來自Java.Lang.Object。生成這些對象所花費的時間非常重要。Xamarin Java.Lang.Object創建效率低下

我創建了一個簡單的測試,看看需要多長時間來簡單地創建5000個對象從java.lang.Object中派生,它與分別創建5000個對象從System.Object派生。

public class MyJavaObject : Java.Lang.Object { }  
public class MyObject : System.Object { } 

private void CreateObjects() 
{ 
    var objectCount = 5000; 

    var javaObjectsWatch = new Stopwatch(); 
    javaObjectsWatch.Start(); 
    for (int i = 0; i < objectCount; i++) 
    { 
     new MyJavaObject(); 
    } 
    javaObjectsWatch.Stop(); 
    var javaObjectsCreationElapsed = javaObjectsWatch.Elapsed.TotalMilliseconds; 
    Console.WriteLine($"{objectCount} java objects took {javaObjectsCreationElapsed} milliseconds"); 

    var objectsWatch = new Stopwatch(); 
    objectsWatch.Start(); 
    for (int i = 0; i < objectCount; i++) 
    { 
     new MyObject(); 
    } 
    objectsWatch.Stop(); 
    var objectsCreationElapsed = objectsWatch.Elapsed.TotalMilliseconds; 
    Console.WriteLine($"{objectCount} objects took {objectsCreationElapsed} milliseconds"); 
} 

運行CreateObject將結果寫入控制檯。

「5000個Java對象了4437.1033毫秒」

「5000個對象了1.831毫秒」

它需要近45秒,以創建MyJavaObjects,而不是第二個爲MyObjects甚至百分之一。

我怎樣才能得到MyJavaObjects的創作更接近創造MyObjects的效率?

+1

從我的角度來看,你會不會想創建5000點的對象(無論是類型,設備。OS或UI控件)被放置到將要使用的adaperview /列表視圖中的/ etc ..數據源的性能開銷Java橋將成爲您剛剛開始看到的問題。對於較小的數據集,性能差異很小,很可能不會被注意到,對於大型數據集,我們通過綁定項目將數據集採集(通過像Smoothie這樣的java庫)異步添加到Java控件本身中,並將其添加到Xamarin中。這當然是*只是一種方式來皮膚貓... – SushiHangover

+1

@SushiHangover是現貨,這不是一個典型的用例,但它絕對值得調查。我的猜測是,Java.Lang.Object創作需要更長的時間,因爲您在每次迭代時都跨越虛擬機邊界。當您新建Java.Lang.Object派生類時,幕後會發生很多工作。 – matthewrdev

回答

2

Java對象的創建包含部分:1)對象上Dalvik虛擬機創建的; 2)在Xamarin.Android VM上創建相應的對象來跟蹤另一個對象的生命週期。非常類似於.NET/COM的互操作。

因此,它不會像你想的快,但仍然爲大多數移動應用的速度不夠快。解決方案需要使用一組特定組件時,這是一項負擔。對於其他場景,Xamarin.Android可以直接調用Android本地API而無需觸及Dalvik。

一些內部的可米格爾奧德伊卡薩對單博客爲Android找到。