Массив ([0] = & gt; Массив ([id] = & gt; 1 [name] = & gt; john) [1] = & gt; Массив ([id] = & gt; 2 [name] = & quot; smith) [2] = & gt; Array ([id] = & gt; 3 [name] = & gt; john) [3] = & gt; Array ([id] = & gt; 4 [name] = & gt; robert) ) $ temp = array_unique (array_column ($ array, 'name')); $ unique_arr = array_intersect_key ($ array, $ temp);
Это приведет к удалению дубликатов имен из массива. уникальный ключ
Хорошо, поскольку вы говорите, что уверены, что это важно, вы должны просто написать тестовую программу и измерить ее, чтобы найти разницу.
Сравнение может быть быстрее, если этот код выполняется по нескольким переменным, выделенным на разбросанных адресов в памяти. При сравнении вы будете только читать данные из памяти в кеш процессора, и если вы не измените значение переменной, когда кеш решит очистить строку, он увидит, что строка не была изменена, и нет необходимости записывать ее обратно к памяти. Это может ускорить выполнение.
Я помню, что в одной книге о языке ассемблера автор утверждал, что, если это возможно, следует избегать, если это возможно. Это намного медленнее, если условие ложно, и выполнение должно перейти к другой линии, что значительно замедляет производительность. Кроме того, поскольку программы выполняются в машинный код, я думаю, что «if» медленнее на каждом (скомпилированном) языке, если его условие не истинно почти все время.
Почему вы даже напишете первую версию? В чем преимущество проверки, чтобы убедиться, что что-то ложно, прежде чем устанавливать его true. Если вы всегда собираетесь установить его true, тогда всегда устанавливайте его true.
Когда у вас есть узкое место в производительности, которое вы проследили до ненужного значения одного логического значения, вернитесь и поговорите с нами.
Все зависит от типа данных. Назначение булевых ускорений быстрее, чем их сравнение. Но это может быть неверно для более крупных основанных на данных типов данных.
Это не только предварительная оптимизация , это микро-оптимизация , что является нерелевантным отвлечением.
] Предполагая, что ваш массив имеет логический тип, тогда ваше сравнение не нужно, что является единственным соответствующим наблюдением.
Как отмечали другие, это микро-оптимизация.
(В политике или журналистике это известно как пуповизна; -)
Является ли программа достаточно большой для имеют более чем несколько уровней вызовов функции / метода / подпрограммы?
Если это так, вероятно, были некоторые предотвратимые вызовы, и они могут тратить сотни раз на столько же времени, как и на невысокую неэффективность.
В предположении, что вы удалили те (что мало кто делает), тогда, во что бы то ни стало, запустите его 10 ^ 9 раз под секундомером и посмотрите, что быстрее.
Если вы просто хотите перевернуть значения, выполните следующие действия:
array [i] =! array [i];
Производительность с использованием этого на самом деле хуже, потому что вместо того, чтобы делать только одну проверку для истинного ложного значения, а затем устанавливая ее, она проверяет дважды.
Если вы объявить массив элементов 1000000 из сравнения true, false, true, false, медленнее. (var b =! b) по существу выполняет проверку дважды, а не один раз
Можете попробовать:
if (! array [i]) array [i] = true;
Но на самом деле единственный способ узнать наверняка - это профиль, я уверен, что любой компилятор видел бы сравнение с ложным как ненужное и оптимизировал его.
Я действительно не ожидал, что будет какая-то заметная разница в производительности для чего-то столь же тривиального, как это, поэтому, конечно, это сводится к тому, что дает вам четкий, читаемый код. Я считаю, что всегда будет присваивать true.
Изменить: я написал скрипт в PHP. Я просто заметил, что в нем была вопиющая ошибка, означающая, что наилучшее время исполнения вычислялось некорректно (страшно, что никто не заметил!)
Лучший случай просто превосходит прямое назначение, но худший случай - это намного хуже , чем простое назначение.
Выход:
Код:
& lt;? php $ arr = array (); $ mtime = explode ("", microtime ()); $ starttime = $ mtime [1] + $ mtime [0]; reset_arr ($ обр); for ($ i = 0; $ i & lt; 10000; $ i ++) $ arr [i] = true; $ mtime = explode ("", microtime ()); $ firsttime = $ mtime [1] + $ mtime [0]; $ totaltime = ($ firsttime - $ starttime); echo "присваивание в". $ totaltime. "seconds & lt; br / & gt;"; reset_arr ($ обр); for ($ i = 0; $ i & lt; 10000; $ i ++), если ($ arr [i]) $ arr [i] = true; $ mtime = explode ("", microtime ()); $ secondtime = $ mtime [1] + $ mtime [0]; $ totaltime = ($ secondtime - $ firsttime); echo "худшее сравнение случаев в". $ totaltime. "seconds & lt; br / & gt;"; reset_arr ($ обр); for ($ i = 0; $ i & lt; 10000; $ i ++), если (! $ arr [i]) $ arr [i] = false; $ mtime = explode ("", microtime ()); $ thirdtime = $ mtime [1] + $ mtime [0]; $ totaltime = ($ thirdtime - $ secondtime); эхо "сравнение наилучшего случая в". $ totaltime. "seconds & lt; br / & gt;"; функция reset_arr ($ arr) {for ($ i = 0; $ i & lt; 10000; $ i ++) $ arr [$ i] = false; }
Я считаю, что если утверждения сравнения и присваивания являются как атомарными (то есть одна инструкция процессора), а цикл выполняется n раз, то в худшем случае сравнение требует назначения n + 1 (сравнение на каждой итерации плюс установка назначения) в то время как постоянная настройка bool потребует n исполнений. Поэтому второй эффективнее.
Зависит от языка. Однако петлевые массивы могут быть дорогостоящими. Если массив находится в последовательной памяти, самым быстрым является запись 1 бита (255) по всему массиву с помощью memcpy, предполагая, что ваш язык / компилятор может это сделать.
Таким образом, выполняя 0 чтение-1, пишите, нет чтение / запись переменной цикла / переменной массива (2 чтения / 2 записи каждого цикла) несколько сотен раз.