C # Проверьте, не является ли переменная не такой, и установите или просто установите [duplicate]

  Массив ([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);   

Это приведет к удалению дубликатов имен из массива. уникальный ключ

24
задан cletus 27 May 2009 в 15:56
поделиться

12 ответов

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

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

16
ответ дан sharptooth 15 August 2018 в 14:29
поделиться
  • 1
    Согласны, с другой стороны, некоторые архитектуры также имеют штраф за ветвление ... Только истинный ответ можно найти, измерив. Или посмотрите на сгенерированный ассемблерный код, чтобы увидеть, если он вообще изменится (моя догадка отсутствует). – Johan Kotlinski 26 May 2009 в 13:46
  • 2
    +1 для "меры" – Binary Worrier 26 May 2009 в 13:51
  • 3
    Не кэшировать это автоматически? т. е. проверить, что данные, которые были написаны, совпадают с данными, которые там есть. – Jules 27 May 2009 в 17:34
  • 4
    @julesjacobs: Не уверен, проверяет ли он равенство. Он наверняка проверяет, обновляется ли он, но я никогда не слышал об этом, проверяя, что обновление является фактическим изменением. Это хороший момент, чтобы иметь в виду. – sharptooth 28 May 2009 в 07:58

Я помню, что в одной книге о языке ассемблера автор утверждал, что, если это возможно, следует избегать, если это возможно. Это намного медленнее, если условие ложно, и выполнение должно перейти к другой линии, что значительно замедляет производительность. Кроме того, поскольку программы выполняются в машинный код, я думаю, что «if» медленнее на каждом (скомпилированном) языке, если его условие не истинно почти все время.

0
ответ дан Alatoo 15 August 2018 в 14:29
поделиться

Почему вы даже напишете первую версию? В чем преимущество проверки, чтобы убедиться, что что-то ложно, прежде чем устанавливать его true. Если вы всегда собираетесь установить его true, тогда всегда устанавливайте его true.

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

0
ответ дан Andy Lester 15 August 2018 в 14:29
поделиться

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

0
ответ дан Benoît 15 August 2018 в 14:29
поделиться

Это не только предварительная оптимизация , это микро-оптимизация , что является нерелевантным отвлечением.

] Предполагая, что ваш массив имеет логический тип, тогда ваше сравнение не нужно, что является единственным соответствующим наблюдением.

26
ответ дан cletus 15 August 2018 в 14:29
поделиться
  • 1
    Я согласен. Может быть, это будет хорошо с точки зрения удобочитаемости, но, конечно, нет, если будет сделано изменение, чтобы «повысить уровень производительности». – Naveen 26 May 2009 в 13:35
  • 2
    +1: Я не мог согласиться больше – Binary Worrier 26 May 2009 в 13:50
  • 3
    @cletus, если это просто один вызов , это микро-оптимизация. Если это звонка на один миллион , это макро-оптимизация. В любом случае связанный поток в stackoverflow.com/q/23228359/632951 – Pacerier 20 April 2016 в 14:58

Как отмечали другие, это микро-оптимизация.

(В политике или журналистике это известно как пуповизна; -)

Является ли программа достаточно большой для имеют более чем несколько уровней вызовов функции / метода / подпрограммы?

Если это так, вероятно, были некоторые предотвратимые вызовы, и они могут тратить сотни раз на столько же времени, как и на невысокую неэффективность.

В предположении, что вы удалили те (что мало кто делает), тогда, во что бы то ни стало, запустите его 10 ^ 9 раз под секундомером и посмотрите, что быстрее.

0
ответ дан Community 15 August 2018 в 14:29
поделиться

Если вы просто хотите перевернуть значения, выполните следующие действия:

  array [i] =! array [i];   

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

Если вы объявить массив элементов 1000000 из сравнения true, false, true, false, медленнее. (var b =! b) по существу выполняет проверку дважды, а не один раз

-1
ответ дан David Anderson 15 August 2018 в 14:29
поделиться

Можете попробовать:

  if (! array [i]) array [i] = true;   

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

0
ответ дан Davy8 15 August 2018 в 14:29
поделиться
  • 1
    Если ваш компилятор хорош, это создаст идентичный машинный код. – Jules 27 May 2009 в 17:36

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

0
ответ дан Mark 15 August 2018 в 14:29
поделиться
  • 1
    Я также не ожидал разницы в производительности. Это вопрос знания лучшего выбора из производительности POV. – jrharshath 26 May 2009 в 13:44

Изменить: я написал скрипт в PHP. Я просто заметил, что в нем была вопиющая ошибка, означающая, что наилучшее время исполнения вычислялось некорректно (страшно, что никто не заметил!)

Лучший случай просто превосходит прямое назначение, но худший случай - это намного хуже , чем простое назначение.

Выход:

  • присвоение в 0.0119960308075 секунд
  • наихудшее сравнение случаев в 0.0188510417938 секундах
  • сравнение наилучшего случая в 0.0116770267487 секундах

Код:

  & 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;  }  
14
ответ дан Oli 15 August 2018 в 14:29
поделиться
  • 1
    Это интересно: назначение на самом деле быстрее! – jrharshath 27 May 2009 в 04:47
  • 2
    Ad с существенным отрывом: 14 мс против 22 до 39 мс. Это примерно в 2 раза! – MSalters 27 May 2009 в 16:29

Я считаю, что если утверждения сравнения и присваивания являются как атомарными (то есть одна инструкция процессора), а цикл выполняется n раз, то в худшем случае сравнение требует назначения n + 1 (сравнение на каждой итерации плюс установка назначения) в то время как постоянная настройка bool потребует n исполнений. Поэтому второй эффективнее.

1
ответ дан redbandit 15 August 2018 в 14:29
поделиться

Зависит от языка. Однако петлевые массивы могут быть дорогостоящими. Если массив находится в последовательной памяти, самым быстрым является запись 1 бита (255) по всему массиву с помощью memcpy, предполагая, что ваш язык / компилятор может это сделать.

Таким образом, выполняя 0 чтение-1, пишите, нет чтение / запись переменной цикла / переменной массива (2 чтения / 2 записи каждого цикла) несколько сотен раз.

1
ответ дан VeNoM 15 August 2018 в 14:29
поделиться
Другие вопросы по тегам:

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