Я предполагаю, что C # и Java API одинаковы.Раньше я работал в среде, где и C #, и Java должны были общаться с одной и той же библиотекой C ++ через interop / JNI.Кажется, что версия Java была более последовательной, когда дело доходило до производительности, поскольку API был довольно болтливым и генерировал много временных объектов.
Вот как выглядели наши вызовы:
double myDouble= theCPPWrapper.GetField("foo").AsDouble();
с theCPPWrapper.GetField(string)
возвратом класса JNI Field
и метода Field.AsDouble()
, проходящего еще один уровень взаимодействия даром ...
Таким образом, сборщик мусора был полон переходных объектов Field и каким-то образом Java казалсясправиться лучше.
В конце концов, исправление было изменить интерфейс API JNI / Interop, чтобы он выглядел так:
double myDouble = theCPPWrapper.GetFieldAsDouble("foo"); // no transient Field. Yay!
Что бы вы ни думали, сначала убедитесь, что ваш родной API не слишком болтлив.или ваш GC пострадает.
Приветствия, Флориан