Это связано с добавлением дополнений, чтобы удовлетворить ограничениям выравнивания. Уравнение структуры данных влияет как на производительность, так и на правильность программ:
SIGBUS
). Вот пример использования типичных настроек для процессора x86 (все используемые 32 и 64-битные режимы):
struct X
{
short s; /* 2 bytes */
/* 2 padding bytes */
int i; /* 4 bytes */
char c; /* 1 byte */
/* 3 padding bytes */
};
struct Y
{
int i; /* 4 bytes */
char c; /* 1 byte */
/* 1 padding byte */
short s; /* 2 bytes */
};
struct Z
{
int i; /* 4 bytes */
short s; /* 2 bytes */
char c; /* 1 byte */
/* 1 padding byte */
};
const int sizeX = sizeof(struct X); /* = 12 */
const int sizeY = sizeof(struct Y); /* = 8 */
const int sizeZ = sizeof(struct Z); /* = 8 */
Можно минимизировать размер структур путем сортировки (например, структура Z
в приведенном выше примере).
ВАЖНОЕ ЗАМЕЧАНИЕ: В стандартах C и C ++ указано, что выравнивание структуры определяется реализацией , Поэтому каждый компилятор может выбрать выравнивание данных по-разному, что приводит к разным и несовместимым макетам данных. По этой причине при работе с библиотеками, которые будут использоваться разными компиляторами, важно понять, как компиляторы выравнивают данные. Некоторые компиляторы имеют параметры командной строки и / или специальные #pragma
операторы для изменения настроек выравнивания структуры.
Anna,
Вот большая страница, которая обсуждает различие в производительности между традицией научные языки программирования (Фортран, C++) и c#.
http://msdn.microsoft.com/en-us/magazine/cc163995.aspx
В соответствии со статьей C#, при использовании (2-х) прямоугольных антенных решеток может быть очень хороший исполнитель. Вот график, который показывает разницу в производительности между зубчатыми массивами (массив массивов) и прямоугольные антенные решетки (многомерные) массивы.
сопроводительный текст http://i.msdn.microsoft.com/cc163995.fig08.gif
Я предложил бы экспериментировать самостоятельно и использовал бы Анализ Производительности в VS 2008 для сравнения.
Если использование C# "достаточно быстро" затем, Ваше приложение будет то, что намного легче поддержать.
Удачи!
Для лучшей производительности массива удостоверьтесь, что Вы используете единственный массив размера с более низким индексом 0.
Для доступа к элементам массива максимально быстро можно использовать небезопасные указатели как так:
int[] array = Enumerable.Range(0, 1000).ToArray();
int count = 0;
unsafe {
fixed (int* pArray = array) {
for (int i = 0; i < array.Length; i++) {
count += *(pArray + i);
}
}
}
РЕДАКТИРОВАНИЕ Черт бы побрал! Не заметил, что Вы сказали 2D массив. Этот прием не будет работать с многомерным массивом, таким образом, я не буду уверен, каким количеством справки это будет. Хотя Вы могли превратить любой массив в массив единственного размера путем выполнения некоторой арифметики на индексе массива. Просто зависит от того, если Вы заботитесь о производительности, пораженной в индексации массива или в итерации по массиву.
Если Вы загружаете F# и ссылаетесь на одну из библиотек времени выполнения (я думаю, что это - Фа-диез. PowerPack), и использование Microsoft. Фа-диез. Математика. Матрица. Это оптимизирует себя на основе того, используете ли Вы плотную или разреженную матрицу.
Вы выполняете итерации матрицы строкой или colum или обоими? Вы всегда получаете доступ к соседним элементам, или Вы делаете произвольный доступ на матрице.
Если существует некоторая местность в Ваших доступах, но Вы не получаете доступ к ней последовательный (типичный в умножении матриц, например) затем, можно получить огромное различие в производительности путем хранения матрицы более благоприятным для кэша способом.
Довольно простой способ сделать, который должен записать немного функции доступа для превращения row/colum индексов в индекс и работу над одномерной матрицей, кэш-friendy путь.
Функция должна сгруппировать соседние координаты в соседние индексы. Morton-порядок может использоваться, если Вы работаете над питанием двух размеров. Для размеров непитания можно часто приносить просто самые низкие 4 бита в morton, заказывают и используют нормальную индексную арифметику для верхних битов. Вы все еще получите значительное ускорение, даже если координата для индексации взглядов преобразования, будет казаться, будет дорогостоящей операцией.
http://en.wikipedia.org/wiki/Z-order_ (кривая) <-извините, не может связаться, этому ТАК не нравится URL с тире в ней. Вы имеете к cut'n'paste.
Скорость фактора 10 и больше - реалистический btw. Это зависит от алгоритма Вы ron по Вашим матрицам все же.