Проблемы производительности Java на типах данных и клиенте CIM sblim
У меня есть вопрос / беспокойство относительно стилей реализации, используемых некоторыми платформами Java.
Во-первых, в качестве общего фона я знаю, что создание массивов объектов намного дороже, чем создание необработанных / примитивных типов массивов. Например, если вы попросите какой-нибудь слой ниже для большой порции символьных данных, наиболее эффективным выбором будет использование таких типов, как char[], byte[], ByteArray, а не придумывание типов данных оболочки и возвращение массива объектов.
Тем не менее, я видел фреймворки, которые, кажется, реализуют свои собственные типы данных и ожидают, что массивы этих типов будут передаваться взад и вперед. Это влечет за собой все упомянутые проблемы с производительностью и стоимостью, и действительно неудобно из-за накладных расходов при преобразовании кода.
Например, рассмотрим типы, определенные в пакете javax.cim клиента sblim:
http://sblim.sourceforge.net/cim-client2-v22-doc/javax/cim/package-summary.html
Есть один тип с именем UnsignedInteger8, который в основном является байтом. Существуют и другие типы, которые также имеют эквивалентные эффективные примитивные типы. Есть комментарий о типах данных DMTF, которые, кажется, указывают, что они инкапсулируют различные типы данных в классах Java для соответствия протоколу, но какой ценой?
Итак, чтобы перейти к сути, я хочу знать, может ли кто-то более опытный с производительностью Java и дизайном фреймворка в целом дать отзыв о том, является ли клиент sblim эффективной реализацией или нет. Есть ли обоснование или обоснование для использования этих типов обёрток, таких как UnsignedInteger8, когда они могли просто использовать байт или символ? Оправдывает ли создание стандартизированного и унифицированного кода для обработки всех типов данных DMTF недостаток производительности, который подразумевает использование массива объектов вместо примитивных типов? Я правильно понял или не понял?
Заранее спасибо!
ОБНОВИТЬ
Чтобы дополнительно показать мою точку зрения, рассмотрим этот отрывок:
static StringBuilder convertToText (UnsignedInteger8[] u8arr) {
if (u8arr== null) return null;
StringBuilder sb = new StringBuilder(u8arr.length);
for (UnsignedInteger8 u8 : u8arr) {
sb.append((char)u8.shortValue());
}
return sb;
}
Мне пришлось бы использовать подобный код, чтобы отобразить порцию символьных данных в StringBuilder. Это действительно неэффективно, так как данные уже загружены в память CIM. Зачем мне нужно создавать новый StringBuilder и повторять / копировать все данные снова? Почему клиент CIM не может просто предоставить String, byte[], char[] или ByteBuffer? Я считаю, что это очень неэффективно, и я хотел бы понять, почему в этом мире они реализовали бы его таким образом.
Я понимаю преимущества абстрагирования типов данных и использования предоставляемых Java средств, таких как Comparable, Equals, Collections API и так далее. Это имеет смысл, и я считаю, что его стоит использовать для сложных структурированных данных, таких как Person, Account, Transaction и т. Д., Но не для необработанных / примитивных типов данных. Это слишком много.