Xamarin Java.Lang.Object 创建效率低下

Xamarin Java.Lang.Object creation is inefficient

我需要为 ListView/GridView 生成大量对象列表。据我了解,这些对象必须派生自 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");
}

运行 CreateObjects 将以下内容写入控制台。

“5000 java 个对象花费了 4437.1033 毫秒”

“5000 个对象用了 1.831 毫秒”

创建 MyJavaObjects 需要将近 4.5 秒,而创建 MyObjects 甚至不到百分之一秒。

如何才能使 MyJavaObjects 的创建更接近于创建 MyObjects 的效率?

Java对象的创建包含以下部分:1)对象是在Dalvik VM上创建的; 2) 在 Xamarin.Android VM 上创建一个相应的对象来跟踪另一个对象的生命周期。很像.NET/COM互操作.

因此,它不会像您希望的那样快,但对于大多数移动应用程序来说仍然足够快。当需要使用一组特定的组件时,这是解决方案必须付出的负担。其他场景,Xamarin.Android可以直接调用Android原生API,不接触Dalvik

可以在 Miguel de Icaza 关于 Android.

的 Mono 博客中找到一些内部结构。