что быстрее двухмерный массив или одномерный массив для указателей на символы? - PullRequest
2 голосов
/ 26 марта 2019

Мне просто нужно знать, какой массив быстрее: двумерный массив символов или одномерный массив для указателей символов.

, например:

char* name1[]={"Marc", "Jean-Marie", "Paul", ...}
char name2[][11]={"Marc", "Jean-Marie", "Paul", ...}

, если у меня такой же точный кодчто бы отсортировать эти массивы, какой из них закончится быстрее?

Ответы [ 2 ]

3 голосов
/ 26 марта 2019

Для сортировки по второму варианту потребуются копии строк с использованием промежуточного буфера или подкачки на основе байтов / блоков.Вероятно, это будет «медленнее», чем простое перемещение указателей.

И наоборот, использование указателей на фактические строковые литералы означает только замену указателей при сортировке.Таким образом, вполне вероятно, что это будет «быстрее».

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

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

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

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

0 голосов
/ 26 марта 2019

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

Однако, когда у вас есть большое количество элементов в массиве, вам нужно посмотреть на доступ к кешу.

Для name1 у вас есть массив или указатели. Сами указатели указывают на другое место, где хранятся строковые литералы "Marc" Jean-Marie" и т. Д. Это может вызвать проблемы с правильным кэшированием массивов.

Для name2 строки "Marc" и т. Д. Копируются в массив. Это может быть проще для кэша. Однако следует помнить, что если у вас большой массив, второй подход приведет к большему использованию ОЗУ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...