C# производительность параметра

Всякий раз, когда вам нужен доступ к какой-либо части Java или ObjC-кода, вам нужно создать собственный модуль. По сути, вы создадите базовый проект, использующий код Java / Android, и создадите интерфейс для использования в React Native.

См. Здесь: https://facebook.github.io/react-native/docs/native-modules-ios

21
задан b w 7 June 2011 в 13:57
поделиться

6 ответов

Я сомневаюсь, что Вы найдете любую значительную потерю производительности к использованию out параметр. Необходимо вернуться, информацией вызывающей стороне так или иначе - out является просто другой способ сделать его. Можно найти, что существует приблизительно штраф, если Вы используете параметр экстенсивно в рамках метода, поскольку это может означать дополнительный уровень перенаправления для каждого доступа. Однако я не ожидал бы, что это будет значительно. Как нормальные, напишите самый читаемый код и тест, является ли производительность уже достаточно хорошей прежде, чем попытаться оптимизировать далее.

РЕДАКТИРОВАНИЕ: Остальная часть этого в стороне, эффективно. Это только действительно важно для больших типов значения, которых нужно обычно избегать так или иначе :)

я не соглашаюсь с утверждением Konrad о "возвращаемых значениях для всех типов>, 32 бита обрабатываются подобные или идентичные аргументам на уровне машины так или иначе" все же. Вот немного тестового приложения:

using System;
using System.Diagnostics;
using System.Runtime.CompilerServices;

struct BigStruct
{
    public Guid guid1, guid2, guid3, guid4;
    public decimal dec1, dec2, dec3, dec4;
}

class Test
{
    const int Iterations = 100000000;

    static void Main()
    {
        decimal total = 0m;
        // JIT first
        ReturnValue();
        BigStruct tmp;
        OutParameter(out tmp);

        Stopwatch sw = Stopwatch.StartNew();
        for (int i=0; i < Iterations; i++)
        {
            BigStruct bs = ReturnValue();
            total += bs.dec1;
        }
        sw.Stop();
        Console.WriteLine("Using return value: {0}",
                          sw.ElapsedMilliseconds);

        sw = Stopwatch.StartNew();
        for (int i=0; i < Iterations; i++)
        {
            BigStruct bs;
            OutParameter(out bs);
            total += bs.dec1;
        }
        Console.WriteLine("Using out parameter: {0}",
                          sw.ElapsedMilliseconds);
    }

    [MethodImpl(MethodImplOptions.NoInlining)]
    public static BigStruct ReturnValue()
    {
        return new BigStruct();
    }

    [MethodImpl(MethodImplOptions.NoInlining)]
    public static void OutParameter(out BigStruct x)
    {
        x = new BigStruct();
    }
}

Результаты:

Using return value: 11316
Using out parameter: 7461

В основном при помощи параметра мы пишем данные непосредственно в конечное место назначения, вместо того, чтобы писать это в стековый фрейм маленького метода и затем скопировать его назад в стековый фрейм Основного метода.

Не стесняются критиковать приложение сравнительного теста, хотя - я, возможно, пропустил что-то!

35
ответ дан 29 November 2019 в 20:13
поделиться

Не проблема производительности, но что-то, что подошло ранее - , Вы не можете использовать их с различием в C# 4.0.

Лично, я склонен использовать out параметры изрядное количество в моем частный код (т.е. в классе, имея метод, который возвращает несколько значений, не используя отдельный тип) - но я склонен избегать их на общедоступном API, за исключением bool Try{Something}(out result) шаблон.

5
ответ дан 29 November 2019 в 20:13
поделиться

Нет никаких последствий производительности. out в основном то же как любая старая передача параметров, с технической точки зрения. В то время как могло бы звучать вероятным, что огромные суммы данных копируются (например, для больших структур), это - на самом деле то же что касается возвращаемых значений.

На самом деле, возвращаемые значения для всех типов> 32 бита обрабатываются подобные out аргументы на уровень машины так или иначе.

Обратите внимание на то, что последний оператор не предполагает что, возвращая значение == out параметр в.NET. Сравнительный тест Jon показывает, что это - очевидно (и к сожалению) не случай. На самом деле для создания этого идентичным, названный оптимизацией возвращаемого значения используется в компиляторах C++. Что-то подобное могло потенциально быть сделано в будущих версиях JIT для улучшения производительности возврата больших структур (однако, так как большие структуры довольно редки в.NET, это могло бы быть ненужной оптимизацией).

Однако , (и с моими очень ограниченными знаниями x86 блока), возврат объектов от вызовов функции обычно влечет за собой выделяющее достаточное место на сайте вызова, продвигая адрес на стеке и заполняя его путем копирования возвращаемого значения в него. Это - в основном то же, которое out делает, только опуская ненужную временную копию значения, так как к целевой ячейке памяти можно получить доступ непосредственно.

5
ответ дан 29 November 2019 в 20:13
поделиться

Главной причиной для предотвращения параметров является удобочитаемость кода, а не производительность.

Для типов значения нет никакой реальной разницы так или иначе (они всегда копируют), и для ссылочных типов это - в основном то же как проходящий мимо касательно

Девять раз из десять, Вы - более обеспеченное создание Вашего собственного немого рекордного класса, вместо того, чтобы использовать параметр - это более просто считать и понять, когда Вы возвращаетесь к коду позже.

1
ответ дан 29 November 2019 в 20:13
поделиться

Мимо параметров проходят касательно Поэтому только указателя, передал стек.

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

1
ответ дан 29 November 2019 в 20:13
поделиться

Используя параметр не повреждает производительность. Параметр является в основном параметром ссылки, таким образом, и вызывающая сторона и вызываемый указывают на ту же часть памяти.

0
ответ дан 29 November 2019 в 20:13
поделиться
Другие вопросы по тегам:

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