Сделайте символы копии компилятора с помощью movsd

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

Вот некоторый код для показа этого тонкого различия:

// x is a method assigned to the object using "this"
var A = function () {
    this.x = function () { alert('A'); };
};
A.prototype.updateX = function( value ) {
    this.x = function() { alert( value ); }
};

var a1 = new A();
var a2 = new A();
a1.x();  // Displays 'A'
a2.x();  // Also displays 'A'
a1.updateX('Z');
a1.x();  // Displays 'Z'
a2.x();  // Still displays 'A'

// Here x is a method assigned to the object using "prototype"
var B = function () { };
B.prototype.x = function () { alert('B'); };

B.prototype.updateX = function( value ) {
    B.prototype.x = function() { alert( value ); }
}

var b1 = new B();
var b2 = new B();
b1.x();  // Displays 'B'
b2.x();  // Also displays 'B'
b1.updateX('Y');
b1.x();  // Displays 'Y'
b2.x();  // Also displays 'Y' because by using prototype we have changed it for all instances

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

7
задан Suma 12 April 2010 в 11:04
поделиться

6 ответов

Использование memcpy с постоянным размером

То, что я обнаружил тем временем:

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

Кажется, что если я действительно хочу использовать movsb или movsd всегда, даже с «динамическим» размером, мне придется использовать встроенную сборку или специальные внутренние (см. ниже). Я знаю, что размер «довольно короткий», но компилятор этого не знает, и я не могу сообщить ему об этом - я даже пытался использовать __assume (size <16), но этого недостаточно.

Демо-код, скомпилировать с помощью "-Ob1 (расширение только для встроенных):

  #include <memory.h>

  void MemCpyTest(void *tgt, const void *src, size_t size)
  {
    memcpy(tgt,src,size);
  }

  template <int size>
  void MemCpyTestT(void *tgt, const void *src)
  {
    memcpy(tgt,src,size);
  }

  int main ( int argc, char **argv )
  {
    int src;
    int dst;
    MemCpyTest(&dst,&src,sizeof(dst));
    MemCpyTestT<sizeof(dst)>(&dst,&src);
    return 0;
  }

Специализированные встроенные функции

Недавно я обнаружил, что существует очень простой способ заставить компилятор Visual Studio копировать символы с помощью movsd - очень естественный и простой: с помощью встроенных функций. Могут пригодиться следующие встроенные функции:

3
ответ дан 6 December 2019 в 23:12
поделиться

Вы используете оптимизированную сборку? Он не будет использовать встроенный, если не включена оптимизация. Также стоит отметить, что он, вероятно, будет использовать лучший цикл копирования, чем rep movsd. Он должен попытаться использовать MMX, по крайней мере, для одновременного копирования 64-битных файлов. Фактически, 6 или 7 лет назад я написал оптимизированный для MMX цикл копирования для подобных вещей. К сожалению, внутренняя memcpy компилятора превзошла мою копию MMX примерно на 1%. Это действительно научило меня не делать предположений о том, что делает компилятор.

Фактически, 6 или 7 лет назад я написал оптимизированный для MMX цикл копирования для подобных вещей. К сожалению, внутренний memcpy компилятора превзошел мою копию MMX примерно на 1%. Это действительно научило меня не делать предположений о том, что делает компилятор.

Фактически, 6 или 7 лет назад я написал оптимизированный для MMX цикл копирования для подобных вещей. К сожалению, внутренняя memcpy компилятора превзошла мою копию MMX примерно на 1%. Это действительно научило меня не делать предположений о том, что делает компилятор.

4
ответ дан 6 December 2019 в 23:12
поделиться

На ум приходит несколько вопросов.

Во-первых, как вы поживаете. знаете, что movsd будет быстрее? Вы проверяли его задержку / пропускную способность? Архитектура x86 полна старых старых инструкций, которые не следует использовать, потому что они не очень эффективны на современных процессорах.

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

И, в-третьих, включены ли встроенные функции в свойствах проекта -> C / C ++ ->

6
ответ дан 6 December 2019 в 23:12
поделиться

Вы установили время memcpy? В последних версиях Visual Studio реализация memcpy использует SSE2 ... что должно быть быстрее, чем rep movsd . Если размер блока, который вы копируете, составляет 1 КБ, то это не проблема, что компилятор не использует встроенную функцию, поскольку время для вызова функции будет незначительным по сравнению со временем для копирования.

0
ответ дан 6 December 2019 в 23:12
поделиться

Используйте memcpy. Эта проблема уже решена.

FYI rep movsd не всегда лучший, rep movsb может быть быстрее в некоторых обстоятельствах, а с SSE и т.п. лучше всего movntq [edi], xmm0. Вы даже можете дополнительно оптимизировать использование локальности страниц для большого объема памяти, переместив данные в буфер, а затем переместив их в пункт назначения.

-1
ответ дан 6 December 2019 в 23:12
поделиться

Обратите внимание, что для использования movsd , src должен указывать на память, выровненную по 32-битной границе, и ее длина должна быть кратной 4 байта.

Если да, то почему ваш код использует char * вместо int * или что-то в этом роде? Если это не так, ваш вопрос спорный.

Если вы измените char * на int * , вы можете получить лучший результат от std: : copy .

Edit: вы измерили, что копирование является узким местом?

-1
ответ дан 6 December 2019 в 23:12
поделиться
Другие вопросы по тегам:

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