Что влияет на скорость кода?

попробуйте это

import { Storage } from 'aws-amplify'

const getImgUrl = key => {
    return Storage.get(key)
    .then(res => (res))
    .catch(err => console.log(err))
  }

class Image extends Component {
   this.state = {
     imgSrc: null
   }

  componentDidMount(){
      getImgUrl(this.props.img).then(src => {
        this.setState({imgSrc: src});
      });
   }

  render() {

     if(!this.state.imgSrc) {
       return null;
     }

       return <img src={this.state.imgSrc} />;
    }
}

class Images extends Component {
  render() {
    return(
      <div>
        {arrayWithObjects.map(({img}) => (
          <Image img={img} />
        )}
      </div>
    )
  }
}
9
задан Vordreller 6 March 2009 в 20:49
поделиться

12 ответов

Целые числа являются двоичными. Или скорее целые числа являются просто целыми числами и могут быть представлены в любом основании системы счисления. В основе 10 Вы записали бы 13, в основе 16 Вы запишете d (или 0xd), в двоичном файле Вы записали бы 1101 (или 0b1101). Римляне записали бы XIII. Они все представляют то же понятие номера 'тринадцать'. Среди людей мы склонны использовать основу 10 представлений, но когда Вы просите, чтобы компьютер обработал целые числа, это использует двоичное представление. И это не имеет значения. Тринадцать плюс fortyfive приводит к тому же результату, неважно, как я пишу это. XIII + 0x2D = 13 + 45 = 0xd + 0b101101. Это не имеет значения, какое представление Вы используете, результатом арифметической операции является то же. Который является, почему мы позволяем ЦП использовать двоичное представление для всей целочисленной обработки.

Некоторые языки программирования также дают Вам "десятичный" тип данных, но это обычно связывается с арифметикой с плавающей точкой, где не все значения могут быть представлены во всех основаниях (1/3, может быть представлен легко в основе 3, но не в 2 или 10, например. 1/10 может быть представлен в основе 10, но не 2)

Однако удивительно трудно выбрать какие-то конкретные операции как "медленные", потому что это зависит. Современный ЦП использует много приемов и оптимизации для ускорения большинства операций большую часть времени. Таким образом, действительно то, что необходимо сделать для получения эффективного кода, избегают всех особых случаев. И существуют многие из них, и они обычно больше относятся к комбинации (и порядок) инструкций, чем которые используются инструкции.

Только для давания Вам общее представление о виде тонкости мы говорим о, арифметика с плавающей точкой может быть выполнена как быстро (или иногда быстрее, чем) целочисленная арифметика при идеальных обстоятельствах, но задержка длиннее, означая, что идеальной производительности более трудно достигнуть. Ответвления, которые являются иначе почти бесплатными, становятся болезненными, потому что они подавляют переупорядочение инструкции и планирование в компиляторе и на лету на ЦП, который мешает скрывать эту задержку. Задержка определяет, сколько времени она берет из инструкции, инициируется, пока результат не готов; большинство инструкций только занимает ЦП один такт, Даже если результат не, все же подготавливают следующий цикл, ЦП может запустить другую инструкцию затем. Что означает, что, если результат не сразу необходим, инструкции высокой задержки являются почти бесплатными. Но если необходимо подать результат к следующей инструкции, затем это должно будет ожидать, пока результат не закончен.

Определенные инструкции являются просто медленными независимо от того, что Вы делаете и будете обычно останавливать соответствующие части ЦП, пока инструкция не завершилась (квадратный корень является типичным примером, но целочисленное деление может быть другим. На некотором ЦП, удваивается, в целом страдают от той же проблемы) - с другой стороны, в то время как квадратный корень с плавающей точкой заблокирует конвейер FP, это не будет препятствовать тому, чтобы Вы выполнили целочисленные инструкции одновременно.

Иногда, хранение значений в переменных, которые могли быть повторно вычислены снова по мере необходимости, будет быстрее, потому что они могут быть помещены в регистр, сохраняющий несколько циклов. Другие времена, это будет медленнее, потому что у Вас заканчиваются регистры, и значение должно было бы быть продвинуто к кэшу, или даже к RAM, делая перерасчет на каждом использовании предпочтительным. Порядок, в котором Вы пересекаете память, имеет огромное значение. Случайные (рассеянные) доступы могут взять сотни циклов для завершения, но последовательные почти мгновенны. Выполнение Ваших чтений/записей в правильном шаблоне позволяет ЦП сохранять необходимые данные в кэше почти все время, и обычно "правильный шаблон" означает считывать данные последовательно и работать над блоками ~64kb за один раз. Но иногда нет. На x86 ЦП некоторые инструкции поднимают 1 байт, другие берут 17. Если Ваш код будет содержать многое из первого, то вызов команды и декодирование не будут узким местом, но если это будет полно более длинных инструкций, то это, вероятно, ограничит, сколько инструкций может быть загружено ЦП каждый цикл, и затем сумма, которую это смогло бы выполнить, не имеет значения.

Существует очень немного универсальных правил для производительности в современном ЦП.

22
ответ дан 4 December 2019 в 06:02
поделиться

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

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

Некоторые "факторы" скорости кода:

  • целое число по сравнению с числами с плавающей точкой
  • затраты на ветвление, вызовы функции, контекстные переключения
  • Инструкция ЦП конвейерно обрабатывает разрушения
  • местность maintaing доступа к памяти, когерентности кэша.
4
ответ дан 4 December 2019 в 06:02
поделиться

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

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

Например: Я просто провел прошлые два дня, ускоряя способ, которым мы повторно вычислили определенное множество значений. Я дергал некоторый материал из цикла и предварительно вычислил его, таким образом, он был только сделан времена M вместо M x N времена и сохранил значение в переменной вместо того, чтобы смотреть он каждый раз от где-то в другом месте, потому что то значение использовалось в Компараторе, таким образом, это назовут много во время фазы Collections.sort. Я получил общее время выполнения приблизительно от 45 секунд до 20 секунд. И затем один из моих коллег, на которых здесь намного дольше указали, что я не должен был повторно вычислять те значения, я мог вытащить их из другого объекта. И внезапно это выполняется за 2 секунды. Теперь, когда оптимизация, я могу верить в.

10
ответ дан 4 December 2019 в 06:02
поделиться

Для расширения немного на том, что сказал Oscar Reyes транспорт данных является на самом деле решающим фактором в производительности даже на самых низких уровнях, так, чтобы не только число, но и типы операций, выполняемых ЦП, было крайне важно для общей производительности.

Это особенно верно для процессоров CISC как x86, где сами инструкции могут иметь переменные количества цикла, хотя современные дизайны главным образом смягчают это. Однако это верно для всех центральных процессоров в случае загрузки в память и операций хранилища, которые могут быть многими, многими, много раз более дорогими, чем какая-либо другая операция. С тактовыми частотами современных центральных процессоров по сравнению с задержкой при обращении к памяти можно смотреть на, возможно, десятки инструкций, потраченных впустую в случае неудачного обращения в кэш к миллионам, если Вы получаете отсутствие страницы и должны выйти в диск. Во многих случаях, когда поведение кэша и загрузка и поведение хранилища приняты во внимание, это может на самом деле быть очень, намного быстрее для выполнения значительного количества арифметических операций для перевычислений значения вместо того, чтобы кэшировать его и перечитать его из памяти, даже при том, что загрузка является одной инструкцией по сборке по сравнению со многими инструкциями для выполнения вычисления. В некоторых случаях это может на самом деле иметь смысл полагать, что Ваша производительность ограничена только загрузкой и хранилищами, и рассматривать другие операции как "свободные", хотя это естественно зависит от обстоятельств.

4
ответ дан 4 December 2019 в 06:02
поделиться

Самой большой единственной вещью, с которой я столкнулся в редких случаях, где я на самом деле заботился, является местность. Современные центральные процессоры работают очень быстро, но у них есть ограниченная сумма кэш-памяти, которая легко доступна. Когда они не могут найти то, в чем они нуждаются в кэше, они должны читать из памяти, который является сравнительно медленным. (Когда то, что они ищут, не находится в физической памяти, это действительно медленно.)

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

В многопоточной среде существуют различные ограничения, и Вы будете более обеспечены, если все Ваши потоки будут работать над данными из другого кэша "строки".

3
ответ дан 4 December 2019 в 06:02
поделиться

Если код имеет "скорость", неправильный способ думать о проблеме, IMO.

Выполнение любого данного кода операции занимает постоянное количество времени. Чем больше кодов операций функция имеет, тем больше времени требуется для выполнения. Знание, как минимизировать количество выполняемых кодов операций (и таким образом, для создания самого быстрого кода) состоит в том, почему мы изучаем ASM, алгоритмы исследования, и т.д.

2
ответ дан 4 December 2019 в 06:02
поделиться

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

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

В первую очередь, очевидно, Word Size. Машины на 64 бита имеют больший размер слова (да, больше обычно означает лучше здесь) так, чтобы большинство операций могло быть выполнено быстрее, что касается операций двойной точности в качестве примера (где дважды обычно означает 2 * 32 бита). Архитектура на 64 бита также извлекает выгоду из более крупной шины данных, которые обеспечивают более быстрые скорости передачи данных.

Во-вторых, конвейер также важен. Исходные команды могут быть классифицированы в различных состояниях или фазах так, чтобы, например, инструкции обычно делились на:

  • Выборка: инструкция прочитана из кэша инструкции
  • Декодируйте: инструкция декодируется интерпретируемый для наблюдения то, что мы должны сделать.
  • Выполнитесь: инструкция выполняется (обычно, который означает нести операции в ALU),
  • Доступ к памяти: Если инструкция должна получить доступ к памяти (например, загружают значение реестра из кэша данных), его выполненный здесь.
  • Обратная запись: vaues записываются обратно к целевому регистру.

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

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

Другая оптимизация ЦП будет суперскалярной, который использует избыточный ALUs (например) так, чтобы два добавили, что инструкции могут быть выполнены одновременно. Снова, путем знания точно архитектуры можно оптимизировать упорядочивание инструкций воспользоваться преимуществом. Например, если компилятор не обнаруживает зависимостей, существует в коде, он может перестроить загрузки и арифметику так, чтобы арифметика была отложена к более позднему месту, где все данные доступны, и затем выполните 4 операции одновременно.

Это главным образом используется компиляторами все же.

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

// Make an array, in memory this is represented as a 1.000.000 contiguous bytes
byte[][] array1 = new byte[1000, 1000];
byte[][] array2 = new byte[1000, 1000;
// Add the array items

for (int j = 0; j < 1000; i++)
  for (int i = 0; i < 1000; j++)
     array1[i,j] = array1[i,j] + array2[i,j]

Давайте посмотрим то, что происходит здесь.

array1[0,0] принесен для кэширования. Так как кэш работает в блоках, Вы получаете первые 1 000 байтов в кэш, так, чтобы кэш содержал array1[0,0] к array1[0,999].

array2[0,0] принесен для кэширования. Снова блоки так, чтобы у Вас был array2[0,0] к array2[0,999].

На следующем шаге мы получаем доступ array1 [1,0], который не находится в кэше, и ни один не array2[1,0], таким образом, мы приносим им из памяти для кэширования. Теперь, если мы предположим, что у нас есть очень мало размера кэша, то это сделает array2 [0... 999], чтобы быть вынутым из кэша... и так далее. Таким образом, то, когда мы получаем доступ array2 [0,1] к нему, больше не будет в кэше. Кэш не будет полезен для array2 или array1.

Если мы переупорядочиваем доступы памяти:

for (int i = 0; i < 1000; i++)
  for (int j = 0; j < 1000; j++)
     array1[i,j] = array1[i,j] + array2[j,i]

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

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

Например, такое знание может иметь экстремум в криптографическом программировании, где необходимо обработать очень большие числа (как в 1 024 битах) так, чтобы корректное представление могло улучшить нижнюю математику, которая должна быть выполнена...

4
ответ дан 4 December 2019 в 06:02
поделиться

На скорость кода влияет, в основном объем операций, которые это должно выполнить.

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

Таким образом в конце алгоритм.

Дополнительно (только для комментирования различия между скоростью кода и скоростью программы)

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

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

1
ответ дан 4 December 2019 в 06:02
поделиться

Расхожая мудрость гласит, что лучшие алгоритмы собираются дать Вам, быстрее кодируют, но в действительности это не настолько просто. Jalf является правильным, он просто зависит. Для скомпилированных языков конкретный компилятор может иметь большее значение, чем изменения алгоритма. Кроме того, быстрый процессор должен сделать вещи выполненными быстрее. Обычно. Просто прочитайте Завершенный Код. Это ответит на все Ваши вопросы об оптимизации кода для скорости.

0
ответ дан 4 December 2019 в 06:02
поделиться

Что влияет на скорость кода?

Все.

Обычно самый большой фактор - что-то, о чем Вы даже не думали.

0
ответ дан 4 December 2019 в 06:02
поделиться

На аппаратных средствах 2009, как в недвижимости, существует всего три вещи иметь в виду при размышлении о скорости кода: память, память, память. (Я включаю кэш и местность.)

Уменьшите выделения. Уменьшите записи. Уменьшите чтения.

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

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

0
ответ дан 4 December 2019 в 06:02
поделиться

Да, профилирование является способом сказать, какова скорость.

И да, различные вещи могут вызвать медленное выполнение.

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

Как раз сегодня я работал над приложением, намереваясь сделать его намного быстрее при помощи вычислений градиента закрытой формы в проблеме оптимизации.Угадайте что? Это не было, какова проблема была, это было что-то еще.

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

0
ответ дан 4 December 2019 в 06:02
поделиться
Другие вопросы по тегам:

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