Я прочитал все ответы, здесь что-то очень важное отсутствует, я ПОКУПАЮ. Есть две основные причины: почему мне нужны самозаверяющие анонимные функции или лучше сказано «Выражение с немедленной вызывной функцией (IIFE)»:
Первое объяснено очень хорошо. Для второго, пожалуйста, изучите следующий пример:
var MyClosureObject = (function (){
var MyName = 'Michael Jackson RIP';
return {
getMyName: function () { return MyName;},
setMyName: function (name) { MyName = name}
}
}());
Внимание 1: Мы не назначаем функцию MyClosureObject
, что еще раз является результатом вызова этой функции. Помните ()
в последней строке.
Внимание 2: Что вам дополнительно нужно знать о функциях в Javascript, так это то, что внутренние функции получают доступ к параметрам и переменным функций, которые они определены внутри.
Пусть мы попробуем несколько экспериментов:
Я могу получить MyName
с помощью getMyName
, и он работает:
console.log(MyClosureObject.getMyName());
// Michael Jackson RIP
Следующий хитроумный подход не сработает:
console.log(MyClosureObject.MyName);
// undefined
Но я могу установить другое имя и получить ожидаемый результат:
MyClosureObject.setMyName('George Michael RIP');
console.log(MyClosureObject.getMyName());
// George Michael RIP
Изменить: В приведенном выше примере MyClosureObject
предназначен для использования без префикса new
, поэтому конвенции он не должен быть капитализирован.
Предстоящие Моно 2,2 выпуска будут иметь поддержку SIMD. Miguel de Icaza, занесенный в блог о предстоящей функции здесь и API, здесь.
Хотя будет библиотека, которая будет поддерживать разработку под временем выполнения Windows.NET Microsoft, она не будет иметь выигрышей в производительности, которые Вы ищете, если Вы не выполняете код под Моно временем выполнения. Который мог бы быть выполнимым в зависимости от Ваших обстоятельств.
Обновление: Выпущены моно 2.2
C# может явно выполнить вызов SSE?
Нет. C# не может произвести встроенный IL намного меньше встроенного x86/amd64 блока.
CLR и более конкретно JIT, будут использовать SSE, если это будет доступное удаление потребности вызвать его при большинстве обстоятельств. Я говорю больше всего, потому что я не эксперт SSE, и я уверен, что существуют случаи, где это могло быть выгодно, и JIT не делает оптимизацию.
На основе этой регистрации форума JIT-компилятор MS автоматически использует SSE, если SSE доступен на целевой машине.
Если у Вас есть 'блок' работы, Вы хотите сделать, лучший выбор состоит в том, чтобы записать это в C++ с помощью MMX/SSE intrinsics и затем заставить очень простой / сбросить класс управляемого С++, который переносит функциональность и выставляет ее как класс .NET. Затем Ваш код может просто использовать тот блок, как будто это был нормальный класс.
Для больше о VC intrinsics можно посмотреть на эту небольшую частушку, которую я записал много лет назад.
http://msdn.microsoft.com/en-us/library/0aws1s9k.aspx
О - я предполагаю, что Вы на самом деле желаете использовать параллельные функции для ускорения чего-то. Как другие указали - если Вы просто хотите переместить данные в большие блоки и т.п., JIT уже знает, как использовать SSE для тех основ.
Современные Поддержки C# инструкции SIMD/SSE хорошо и делают их довольно простыми использовать. Не все инструкции все же поддерживаются.
Вот пример SSE.Sum () массива uint []:
using System.Numerics;
private static ulong SumSseInner(this uint[] arrayToSum, int l, int r)
{
var sumVectorLower = new Vector<ulong>();
var sumVectorUpper = new Vector<ulong>();
var longLower = new Vector<ulong>();
var longUpper = new Vector<ulong>();
int sseIndexEnd = l + ((r - l + 1) / Vector<uint>.Count) * Vector<uint>.Count;
int i;
for (i = l; i < sseIndexEnd; i += Vector<int>.Count)
{
var inVector = new Vector<uint>(arrayToSum, i);
Vector.Widen(inVector, out longLower, out longUpper);
sumVectorLower += longLower;
sumVectorUpper += longUpper;
}
ulong overallSum = 0;
for (; i <= r; i++)
overallSum += arrayToSum[i];
sumVectorLower += sumVectorUpper;
for (i = 0; i < Vector<long>.Count; i++)
overallSum += sumVectorLower[i];
return overallSum;
}
Эта конкретная функция является частью и бесплатного пакета самородка с открытым исходным кодом, HPCsharp, доступного на nuget.org, который я поддерживаю.
Уверенный Вы можете (более важный вопрос быть - почему был бы Вы? Просто оставьте это времени выполнения; это - его задание).
C# позволяет Вам отобразить делегата в адресе памяти. Тот адрес памяти может содержать необработанные ассемблерные коды. Можно читать больше на блоге Michael Giagnocavo.
Хотя я не судил меня, может быть возможно использовать Маршала. GetDelegateForFunctionPointer также.