Производительность чтения из массива

#c #arrays #performance #matlab #memory

#c #массивы #Производительность #matlab #память

Вопрос:

В C (и языках более высокого уровня, таких как Matlab), если кто-то хочет повторно использовать (постоянное) значение, хранящееся в массиве, лучше ли хранить его в отдельной переменной, т. е.:

двойной массив[] = {1, 2, 3, 4, 5, …};

двойное количество = массив [3];

И использовать quantity при необходимости, или это так же быстро использовать array[3] ?

Причина, по которой я спрашиваю, заключается в том, что array[3] = *(array 3) и, следовательно, операция сложения должна выполняться для чтения из массива, тогда quantity как может быть прочитана напрямую.

Комментарии:

1. На какой язык вы ссылаетесь? Вы пометили его как C, так и Matlab.

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

3. Я почти уверен, что в большинстве случаев компилятор сделает это за вас под капотом. Обычные компиляторы довольно умны, когда дело доходит до оптимизации …

Ответ №1:

Я не знаю точно, насколько сильно улучшилось, но когда вы это сделаете a[3] , *(a 3) будет найдено:

  1. Получение базового адреса a (доступ к программному счетчику и другим регистрам).
  2. Добавьте смещение к этому адресу, чтобы получить адрес a[3] (используйте ALU).
  3. Затем извлеките значение a[3] (снова доступ к регистрам).

Все это становится понятным при изучении архитектуры процессора (например, MIPS).

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

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

Я хотел бы добавить пример pow() из math.h .

 double begin = clock();
for(long long int i=0;i<pow(10,9);  i);
printf("%lf",(clock()-begin)/CLOCKS_PER_SEC);
 

Приведенный выше код может показать небольшое улучшение производительности при первом сохранении pow(10,9) .

Комментарии:

1. Адрес array 3 является таким же постоянным, как и адрес quantity … Нет необходимости в 3 добавлении во время выполнения.

2. Тогда как компилятор узнает array 3 , не зная, зная базовый адрес array array 0 самого or. Итак, я уже упоминал 3 (into sizeof(variable)) здесь.

3. Компилятор знает базовый адрес array (обычно относительно некоторого указателя фрейма, хотя, но это точно то же самое, что и для адреса quantity , что я имел в виду под «как постоянный»).