В .NET, когда, если когда-нибудь должен, я передаю структуры ссылкой по причинам производительности?

View-Page

<h:selectOneMenu id="selectOneCB" value="#{page.selectedName}">
     <f:selectItems value="#{page.names}"/>
</h:selectOneMenu>

Backing-Bean

   List<SelectItem> names = new ArrayList<SelectItem>();

   //-- Populate list from database

   names.add(new SelectItem(valueObject,"label"));

   //-- setter/getter accessor methods for list

Чтобы отобразить определенную выбранную запись, это должно быть одно из значений в списке.

16
задан Walt D 26 January 2009 в 22:19
поделиться

4 ответа

Я сделал некоторое очень неофициальное профилирование, и результаты указывают, что для моего конкретного приложения существует скромное увеличение производительности для передачи ссылкой. Для значением я получил приблизительно 10 050 000 вызовов в секунду, тогда как для ссылкой я получил приблизительно 11 200 000 вызовов в секунду.

Ваш пробег может варьироваться.

9
ответ дан 30 November 2019 в 22:37
поделиться

Перед выяснением, необходимо ли передать структуру ссылкой, необходимо спросить себя, почему у Вас есть такая огромная структура во-первых. Он действительно потребность быть структурой? Если бы необходимо использовать структуру в какой-то момент для P/Invoke, стоило бы иметь структуру всего для этого и затем эквивалентного класса в другом месте?

структура А, настолько большая, очень, очень необычна...

Посмотрите эти Руководство по проектированию для раздела Developing Class Libraries по Between Classes Выбора и Structures для большего руководства на этом.

8
ответ дан 30 November 2019 в 22:37
поделиться

Единственным путем можно добраться, ответ на этот вопрос должен кодировать обоих и измерить уровень.

Вы упоминаете неуправляемый/управляемый interop. Мой опыт состоит в том, что удивительно требуется много времени к к interop. Вы могли попытаться изменить свой код от:

void ManagedMethod(MyStruct[] items) {
  foreach (var item in items) {
    unmanagedHandle.ProcessOne(item);
  }
}

К:

void ManagedMethod(MyStruct[] items) {
  unmanagedHandle.ProcessMany(items, items.Count);
}

Эта техника помогла мне в подобном случае, но только измерения скажут Вам, если она будет работать на Ваш случай.

2
ответ дан 30 November 2019 в 22:37
поделиться

Почему бы просто не использовать вместо этого класс и не передать свой класс в функцию P / Invoke?

Использование класса будет хорошо передаваться в вашем управляемом коде и будет работать так же, как передача структура со ссылкой на функцию P / Invoke.

например

// What you have
public struct X
{
   public int data;
}
[DllImport("mylib.dll")]
static extern void Foo( ref X arg);

// What you could do
[StructLayout(LayoutKind.Sequential)]
public class Y
{
    public int data;
}
[DllImport("mylib.dll")]
static extern void Bar( Y arg );
-2
ответ дан 30 November 2019 в 22:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: