Арифметика большого массива в C#

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

  • Недопустимый доступ может быть жесткой ошибкой (часто 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 операторы для изменения настроек выравнивания структуры.

10
задан Kev 21 September 2008 в 15:14
поделиться

4 ответа

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# "достаточно быстро" затем, Ваше приложение будет то, что намного легче поддержать.

Удачи!

8
ответ дан 3 December 2019 в 23:15
поделиться

Для лучшей производительности массива удостоверьтесь, что Вы используете единственный массив размера с более низким индексом 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 массив. Этот прием не будет работать с многомерным массивом, таким образом, я не буду уверен, каким количеством справки это будет. Хотя Вы могли превратить любой массив в массив единственного размера путем выполнения некоторой арифметики на индексе массива. Просто зависит от того, если Вы заботитесь о производительности, пораженной в индексации массива или в итерации по массиву.

4
ответ дан 3 December 2019 в 23:15
поделиться

Если Вы загружаете F# и ссылаетесь на одну из библиотек времени выполнения (я думаю, что это - Фа-диез. PowerPack), и использование Microsoft. Фа-диез. Математика. Матрица. Это оптимизирует себя на основе того, используете ли Вы плотную или разреженную матрицу.

2
ответ дан 3 December 2019 в 23:15
поделиться

Вы выполняете итерации матрицы строкой или colum или обоими? Вы всегда получаете доступ к соседним элементам, или Вы делаете произвольный доступ на матрице.

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

Довольно простой способ сделать, который должен записать немного функции доступа для превращения row/colum индексов в индекс и работу над одномерной матрицей, кэш-friendy путь.

Функция должна сгруппировать соседние координаты в соседние индексы. Morton-порядок может использоваться, если Вы работаете над питанием двух размеров. Для размеров непитания можно часто приносить просто самые низкие 4 бита в morton, заказывают и используют нормальную индексную арифметику для верхних битов. Вы все еще получите значительное ускорение, даже если координата для индексации взглядов преобразования, будет казаться, будет дорогостоящей операцией.

http://en.wikipedia.org/wiki/Z-order_ (кривая) <-извините, не может связаться, этому ТАК не нравится URL с тире в ней. Вы имеете к cut'n'paste.

Скорость фактора 10 и больше - реалистический btw. Это зависит от алгоритма Вы ron по Вашим матрицам все же.

0
ответ дан 3 December 2019 в 23:15
поделиться
Другие вопросы по тегам:

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