我需要爲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的效率?
從我的角度來看,你會不會想創建5000點的對象(無論是類型,設備。OS或UI控件)被放置到將要使用的adaperview /列表視圖中的/ etc ..數據源的性能開銷Java橋將成爲您剛剛開始看到的問題。對於較小的數據集,性能差異很小,很可能不會被注意到,對於大型數據集,我們通過綁定項目將數據集採集(通過像Smoothie這樣的java庫)異步添加到Java控件本身中,並將其添加到Xamarin中。這當然是*只是一種方式來皮膚貓... – SushiHangover
@SushiHangover是現貨,這不是一個典型的用例,但它絕對值得調查。我的猜測是,Java.Lang.Object創作需要更長的時間,因爲您在每次迭代時都跨越虛擬機邊界。當您新建Java.Lang.Object派生類時,幕後會發生很多工作。 – matthewrdev