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
Перемещение семантики должно выполняться лучше. Но есть только один способ найти это: сравните его. – Samuel
Как насчет Google для чего-то вроде «memmove vs memcpy»? Или написать контрольный показатель и измерить производительность на нескольких разных компьютерах? – Michael
Действительно ли это имеет значение? Маленькие струны маленькие; их назначение будет быстрым в любом случае. – MSalters