2015-03-25 3 views
2

Я переписываю все структуры данных, которые я изучил в школе, как упражнение, чтобы укрепить мое понимание основ информатики, но я пытаюсь оптимизировать свои наивные реализации, которые я создал, когда я был моложе.Скорость доступа к указателю

Это привело меня к вопросу:

У меня есть эти несколько строк из моей реализации связанного списка, где температура используются в обеих вариантах ...

Node<T> *temp = head; 

if(temp == nullptr) { 
    ... 
} 

... // temp used here 

Моего связанный список также имеет атрибут long listSize , поэтому указанная выше линия является аналогом

if(!listSize) { 
    ... 
} 

... // temp used here, too. 

Это очевидно. Что менее очевидно (для меня), какая из них будет быстрее для компьютера.

От чего (мало) Я понимаю о указателях, любая операция с ними довольно дорога, что заставляет меня поверить, что первое могло быть менее оптимальным, чем последнее; однако я не совсем уверен.

Может кто-нибудь помочь прояснить этот нюанс для меня?

Спасибо, erip

EDIT

После размещения этого я решил поставить эксперимент. Я решил сделать первую реализацию method2 и вторую реализацию method1. Я запускал его несколько раз на логарифмических входах в диапазоне от 10 М до 1 В, и по большому счету method2 был быстрее (хотя и не очень - незначительный 1us), чем method1.

После некоторого созерцания, я полагаю, это имеет смысл, поскольку указатели 8-байтовые на моей архитектуре, которые имеют тот же размер, что и длинный int. Таким образом, сравнение с NULL должно быть очень похожим процессом и, вероятно, займет примерно одно и то же время.

+0

Вторая кажется быстрее, потому что нет назначения. Но это просто догадки. Мера, чтобы узнать. – emlai

+1

В обоих случаях небольшое значение сравнивается с нолем. Могут быть незначительные различия, но даже с некоторой чрезвычайно большой относительной разницей влияние на ваш код, скорее всего, будет неизмеримым. Тем не менее, сделайте ** измерение **, чтобы установить, действительно ли вы видите какую-либо разницу или нет. –

+0

@zenith переменной temp будет по-прежнему понадобиться позже. Я говорил в терминах выражения 'if'. – erip

ответ

6

Из того, что (немного) Я понимаю про указатели, любая операция с ними довольно дорого

Это не верно в целом: хотя уровень косвенности (то есть доступ к что-то через указатель) делает имеют стоимость, современное оборудование оптимизирует его до такой степени, что вам не удастся рассказать во всех, кроме самых крайних случаях. Агрессивное кэширование делает эту разницу еще меньше, поэтому вызов косвенного доступа «довольно дорого» не является точным.

Однако в вашем случае это еще проще: нет никакой косвенности вообще! Вы проверяете значение самого указателя, а не значение того, на что оно указывает, поэтому практически нет разницы между проверкой указателя и проверкой длины. Указатель может составлять 8 байтов, а длина может быть 4 байта, но вы не сможете определить разницу во времени на современных процессорах.

1

Я думаю, оба они одинаковы. В обоих случаях вы делаете логическое сравнение. Указатель также является переменной. Он просто содержит адрес и находится в той же области памяти, что и другие переменные.

Однако в глубине (сборе) первый случай может быть медленнее, поскольку он использует две переменные вместо одной.

Смежные вопросы