Всякий раз, когда вам нужен доступ к какой-либо части Java или ObjC-кода, вам нужно создать собственный модуль. По сути, вы создадите базовый проект, использующий код Java / Android, и создадите интерфейс для использования в React Native.
См. Здесь: https://facebook.github.io/react-native/docs/native-modules-ios
Я сомневаюсь, что Вы найдете любую значительную потерю производительности к использованию 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
В основном при помощи параметра мы пишем данные непосредственно в конечное место назначения, вместо того, чтобы писать это в стековый фрейм маленького метода и затем скопировать его назад в стековый фрейм Основного метода.
Не стесняются критиковать приложение сравнительного теста, хотя - я, возможно, пропустил что-то!
Не проблема производительности, но что-то, что подошло ранее - , Вы не можете использовать их с различием в C# 4.0.
Лично, я склонен использовать out
параметры изрядное количество в моем частный код (т.е. в классе, имея метод, который возвращает несколько значений, не используя отдельный тип) - но я склонен избегать их на общедоступном API, за исключением bool Try{Something}(out result)
шаблон.
Нет никаких последствий производительности. out
в основном то же как любая старая передача параметров, с технической точки зрения. В то время как могло бы звучать вероятным, что огромные суммы данных копируются (например, для больших структур), это - на самом деле то же что касается возвращаемых значений.
На самом деле, возвращаемые значения для всех типов> 32 бита обрабатываются подобные out
аргументы на уровень машины так или иначе.
Обратите внимание на то, что последний оператор не предполагает что, возвращая значение == out
параметр в.NET. Сравнительный тест Jon показывает, что это - очевидно (и к сожалению) не случай. На самом деле для создания этого идентичным, названный оптимизацией возвращаемого значения используется в компиляторах C++. Что-то подобное могло потенциально быть сделано в будущих версиях JIT для улучшения производительности возврата больших структур (однако, так как большие структуры довольно редки в.NET, это могло бы быть ненужной оптимизацией).
Однако , (и с моими очень ограниченными знаниями x86 блока), возврат объектов от вызовов функции обычно влечет за собой выделяющее достаточное место на сайте вызова, продвигая адрес на стеке и заполняя его путем копирования возвращаемого значения в него. Это - в основном то же, которое out
делает, только опуская ненужную временную копию значения, так как к целевой ячейке памяти можно получить доступ непосредственно.
Главной причиной для предотвращения параметров является удобочитаемость кода, а не производительность.
Для типов значения нет никакой реальной разницы так или иначе (они всегда копируют), и для ссылочных типов это - в основном то же как проходящий мимо касательно
Девять раз из десять, Вы - более обеспеченное создание Вашего собственного немого рекордного класса, вместо того, чтобы использовать параметр - это более просто считать и понять, когда Вы возвращаетесь к коду позже.
Мимо параметров проходят касательно Поэтому только указателя, передал стек.
, Если Ваш тип значения является большим, существует меньше копии, но затем необходимо разыменовать указатель на каждом переменном использовании.
Используя параметр не повреждает производительность. Параметр является в основном параметром ссылки, таким образом, и вызывающая сторона и вызываемый указывают на ту же часть памяти.