2015-06-03 2 views
0
std::string test = "small_string"; 

std::string test2_1 = test; // line 1 

std::string test2_2 = std::move(test); // line 2 

привет, мне любопытно, какая версия строки создается быстро. test2_1 или test2_2?оптимизация небольших строк (SSO) и семантика перемещения

Я смотрел в орудие на VC++ версии std::string, выяснилось, что test2_1 версия будет вызывать memcpy(_First1, _First2, _Count)) и test2_2 будем называть memmove(_First1, _First2, _Count)), и мне просто интересно, какой из них лучше, если я хочу, чтобы мой код работать быстрее.

==================================================================================================================================== ================

привет, я просто сделать некоторые испытания, и там есть что-то, что я не могу понять ... вот мой тестовый код:

{ 
    Timer t; 
    for (int i = 0; i < 1000000; i++){ 
     char s[] = "small_string"; 
     char t[10]; 

     memcpy(&t, &s, 10); 
     //std::cout << t << std::endl; 
    } 

    std::cout << "test, memcpy: " << t.elapsed() << " second" << std::endl; 
} 


{ 
    Timer t; 
    for (int i = 0; i < 1000000; i++){ 
     char s[] = "small_string"; 
     char t[10]; 
     memmove(&t, &s, 10); 
     // std::cout << t << std::endl; 
    } 

    std::cout << "test, memmove: " << t.elapsed() << " second" << std::endl; 
} 


{ 
    Timer t; 
    for (int i = 0; i < 1000000; i++){ 

     std::string test = "small_string"; 
     std::string test2_1 = test; // line 1 
    } 

    std::cout << "test, str copy: " << t.elapsed() << " second" << std::endl; 
} 


{ 
    Timer t; 
    for (int i = 0; i < 1000000; i++){ 

     std::string test = "small_string"; 
     std::string test2_2 = std::move(test); // line 2 
    } 
    std::cout << "test, str move: " << t.elapsed() << " second" << std::endl; 
} 

и результата: (отладка сборка)

тест, тетср: 0,0090005 второго

теста, memmove: 0,0110006 второго

тест, ули копию: 4,92528 второго

теста, ули ход: 4,52926 второго

Я знаю, что тетср должен быстрее, чем memmove, и мой первые два теста доказать. Но результат std :: string отличается ... move version быстрее, чем версия для копирования. Я не знал, почему даже глядя на реализацию std :: string, я не нашел ничего, что могло бы убедить меня, что это должно произойти.

================================================================================================================================== =========

результат: (релиз сборка)

теста, тетср: 0 второго

теста, memmove: 0,0080004 второго

тест, ул копия: 0,0330019 вторых

test, str move: 0.0290017 second

+0

Перемещение семантики должно выполняться лучше. Но есть только один способ найти это: сравните его. – Samuel

+0

Как насчет Google для чего-то вроде «memmove vs memcpy»? Или написать контрольный показатель и измерить производительность на нескольких разных компьютерах? – Michael

+1

Действительно ли это имеет значение? Маленькие струны маленькие; их назначение будет быстрым в любом случае. – MSalters

ответ

1

привет, мне любопытно, какая версия строки создается быстро. test2_1 или test2_2?

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

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

Линия 1 оставляет test без изменений, поэтому сохраняет то же значение. Строка 2 изменяет test, оставляя ее в неуказанном состоянии.

Если ваш код не зависит от значения test после создания другой строки, то вы должны использовать std::move, потому что он выражает желаемую семантику (и если строка не подходит в буфере с малой строкой, она будет определенно Быстрее).

Если ваш код заботится о значении test, то не используйте std::move, просто сделайте копию вместо этого.

Бенчмаркинг разницы между яблоками и апельсинами - пустая трата времени.

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

+0

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

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