Короче говоря, я пытался построить строковое представление последовательности байтов и обнаружил, что прямое применение правил преобразования быстрее, чем построение таблицы поиска и выполнение поиска, а использование std::vector быстрее, чем использование std::unordered_map.
Но затем происходит что-то действительно странное и я не знаю, почему это так.
Поэтому я использовал лямбда-функцию для создания таблицы поиска с использованием правил преобразования. Это экономит символы, занимаемые копированием данных.
И почему-то из-за этого функция работает в десятки раз медленнее, если с помощью лямбда-функций сгенерировано несколько таблиц, содержащих одни и те же значения.
Но дело в том, что если я скопирую- вставьте в программу те же данные, которые были бы сгенерированы лямбда-функцией, под другим именем, каким-то образом функция, использующая эту сгенерированную лямбда-таблицу, становится намного быстрее, я не знаю почему:
Код: Выделить всё
#include
#include
#include
#include
#include
#include
#include
#include
#include
using std::vector;
typedef vector bytes;
using std::string;
using std::chrono::steady_clock;
using std::chrono::duration;
using std::cout;
using std::unordered_map;
string DIGITS = "0123456789abcdef";
const vector HEX1 = [] {
vector data(256);
for (uint8_t i = 0; i < 255; i++) {
data[i] = "\\x" + DIGITS[(i & 240) >> 4] + DIGITS[i & 15];
}
data[255] = "\\xff";
return data;
} ();
static inline string hexlify3(bytes arr) {
string repr = "";
for (auto& chr : arr) {
repr += " " + DIGITS[(chr & 240) >> 4] + DIGITS[chr & 15];
}
repr.erase(0, 1);
return repr;
}
static inline string hexlify5(bytes arr) {
string repr = "";
for (auto& chr : arr) {
repr += " " + HEX1[chr];
}
repr.erase(0, 1);
return repr;
}
uint32_t number = 5415321543947302498;
bytes _bytes;
char lorem_ipsum[] = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.";
bytes placeholder = [] {
bytes _bytes(124);
std::memcpy(_bytes.data(), &lorem_ipsum[0], 124);
return _bytes;
} ();
string temp;
char answer[] = "@\x9b\x90\x00\x00\x00\x00\x00, the great answer to life, the universe and everything, squared";
bytes _answer = [] {
bytes _bytes(72);
std::memcpy(_bytes.data(), &answer[0], 72);
return _bytes;
} ();
int main() {
auto start = steady_clock::now();
for (int i = 0; i < 4096; i++) {
temp = hexlify3(placeholder);
}
auto end = steady_clock::now();
duration time = end - start;
cout C:\Users\Estranger\source\repos\hexlify_test\x64\Release\hexlify_test.exe
hexlify3: 3117.41 nanoseconds
hexlify5: 3137.28 nanoseconds
PS D:\xoreos-tools-master\bin\Release> C:\Users\Estranger\source\repos\hexlify_test\x64\Release\hexlify_test.exe
hexlify3: 3093.63 nanoseconds
hexlify5: 3038.82 nanoseconds
Код: Выделить всё
const unordered_map ASCII = [] {
unordered_map data;
for (uint8_t i = 0; i < 128; i++) {
if (std::isprint(i)) {
data[i] = char(i);
}
else {
data[i] = "\\x" + DIGITS[(i & 240) >> 4] + DIGITS[i & 15];
}
}
for (int i = 128; i < 256; i++) {
data[i] = "\\x" + DIGITS[(i & 240) >> 4] + DIGITS[i & 15];
}
data[9] = "\\t";
data[10] = "\\n";
data[13] = "\\r";
data[92] = "\\\\";
return data;
}();
const vector ASCII1 = [] {
vector data(256);
for (uint8_t i = 0; i < 128; i++) {
if (std::isprint(i)) {
data[i] = char(i);
}
else {
data[i] = "\\x" + DIGITS[(i & 240) >> 4] + DIGITS[i & 15];
}
}
for (int i = 128; i < 256; i++) {
data[i] = "\\x" + DIGITS[(i & 240) >> 4] + DIGITS[i & 15];
}
data[9] = "\\t";
data[10] = "\\n";
data[13] = "\\r";
data[92] = "\\\\";
return data;
}();
Код: Выделить всё
vector H E X 2 = { < b r / > & q u o t ; \ \ x 0 0 & q u o t ; , < b r / > & q u o t ; \ \ x 0 1 & q u o t ; , < b r / > & q u o t ; \ \ x 0 2 & q u o t ; , < b r / > & q u o t ; \ \ x 0 3 & q u o t ; , < b r / > & q u o t ; \ \ x 0 4 & q u o t ; , < b r / > & q u o t ; \ \ x 0 5 & q u o t ; , < b r / > & q u o t ; \ \ x 0 6 & q u o t ; , < b r / > & q u o t ; \ \ x 0 7 & q u o t ; , < b r / > & q u o t ; \ \ x 0 8 & q u o t ; , < b r / > & q u o t ; \ \ x 0 9 & q u o t ; , < b r / > & q u o t ; \ \ x 0 a & q u o t ; , < b r / > & q u o t ; \ \ x 0 b & q u o t ; , < b r / > & q u o t ; \ \ x 0 c & q u o t ; , < b r / > & q u o t ; \ \ x 0 d & q u o t ; , < b r / > & q u o t ; \ \ x 0 e & q u o t ; , < b r / > & q u o t ; \ \ x 0 f & q u o t ; , < b r / > & q u o t ; \ \ x 1 0 & q u o t ; , < b r / > & q u o t ; \ \ x 1 1 & q u o t ; , < b r / > & q u o t ; \ \ x 1 2 & q u o t ; , < b r / > & q u o t ; \ \ x 1 3 & q u o t ; , < b r / > & q u o t ; \ \ x 1 4 & q u o t ; , < b r / > & q u o t ; \ \ x 1 5 & q u o t ; , < b r / > & q u o t ; \ \ x 1 6 & q u o t ; , < b r / > & q u o t ; \ \ x 1 7 & q u o t ; , < b r / > & q u o t ; \ \ x 1 8 & q u o t ; , < b r / > & q u o t ; \ \ x 1 9 & q u o t ; , < b r / > & q u o t ; \ \ x 1 a & q u o t ; , < b r / > & q u o t ; \ \ x 1 b & q u o t ; , < b r / > & q u o t ; \ \ x 1 c & q u o t ; , < b r / > & q u o t ; \ \ x 1 d & q u o t ; , < b r / > & q u o t ; \ \ x 1 e & q u o t ; , < b r / > & q u o t ; \ \ x 1 f & q u o t ; , < b r / > & q u o t ; \ \ x 2 0 & q u o t ; , < b r / > & q u o t ; \ \ x 2 1 & q u o t ; , < b r / > & q u o t ; \ \ x 2 2 & q u o t ; , < b r / > & q u o t ; \ \ x 2 3 & q u o t ; , < b r / > & q u o t ; \ \ x 2 4 & q u o t ; , < b r / > & q u o t ; \ \ x 2 5 & q u o t ; , < b r / > & q u o t ; \ \ x 2 6 & q u o t ; , < b r / > & q u o t ; \ \ x 2 7 & q u o t ; , < b r / > & q u o t ; \ \ x 2 8 & q u o t ; , < b r / > & q u o t ; \ \ x 2 9 & q u o t ; , < b r / > & q u o t ; \ \ x 2 a & q u o t ; , < b r / > & q u o t ; \ \ x 2 b & q u o t ; , < b r / > & q u o t ; \ \ x 2 c & q u o t ; , < b r / > & q u o t ; \ \ x 2 d & q u o t ; , < b r / > & q u o t ; \ \ x 2 e & q u o t ; , < b r / > & q u o t ; \ \ x 2 f & q u o t ; , < b r / > & q u o t ; \ \ x 3 0 & q u o t ; , < b r / > & q u o t ; \ \ x 3 1 & q u o t ; , < b r / > & q u o t ; \ \ x 3 2 & q u o t ; , < b r / > & q u o t ; \ \ x 3 3 & q u o t ; , < b r / > & q u o t ; \ \ x 3 4 & q u o t ; , < b r / > & q u o t ; \ \ x 3 5 & q u o t ; , < b r / > & q u o t ; \ \ x 3 6 & q u o t ; , < b r / > & q u o t ; \ \ x 3 7 & q u o t ; , < b r / > & q u o t ; \ \ x 3 8 & q u o t ; , < b r / > & q u o t ; \ \ x 3 9 & q u o t ; , < b r / > & q u o t ; \ \ x 3 a & q u o t ; , < b r / > & q u o t ; \ \ x 3 b & q u o t ; , < b r / > & q u o t ; \ \ x 3 c & q u o t ; , < b r / > & q u o t ; \ \ x 3 d & q u o t ; , < b r / > & q u o t ; \ \ x 3 e & q u o t ; , < b r / > & q u o t ; \ \ x 3 f & q u o t ; , < b r / > & q u o t ; \ \ x 4 0 & q u o t ; , < b r / > & q u o t ; \ \ x 4 1 & q u o t ; , < b r / > & q u o t ; \ \ x 4 2 & q u o t ; , < b r / > & q u o t ; \ \ x 4 3 & q u o t ; , < b r / > & q u o t ; \ \ x 4 4 & q u o t ; , < b r / > & q u o t ; \ \ x 4 5 & q u o t ; , < b r / > & q u o t ; \ \ x 4 6 & q u o t ; , < b r / > & q u o t ; \ \ x 4 7 & q u o t ; , < b r / > & q u o t ; \ \ x 4 8 & q u o t ; , < b r / > & q u o t ; \ \ x 4 9 & q u o t ; , < b r / > & q u o t ; \ \ x 4 a & q u o t ; , < b r / > & q u o t ; \ \ x 4 b & q u o t ; , < b r / > & q u o t ; \ \ x 4 c & q u o t ; , < b r / > & q u o t ; \ \ x 4 d & q u o t ; , < b r / > & q u o t ; \ \ x 4 e & q u o t ; , < b r / > & q u o t ; \ \ x 4 f & q u o t ; , < b r /> "\\x50",
"\\x51",
"\\x52",
"\\x53",
"\\x54",
"\\x55",
"\\x56",
"\\x57",
"\\x58",
"\\x59",
"\\x5a",
"\\x5b",
"\\x5c",
"\\x5d",
"\\x5e",
"\\x5f",
"\\x60",
"\\x61",
"\\x62",
"\\x63",
"\\x64",
"\\x65",
"\\x66",
"\\x67",
"\\x68",
"\\x69",
"\\x6a",
"\\x6b",
"\\x6c",
"\\x6d",
"\\x6e",
"\\x6f",
"\\x70",
"\\x71",
"\\x72",
"\\x73",
"\\x74",
"\\x75",
"\\x76",
"\\x77",
"\\x78",
"\\x79",
"\\x7a",
"\\x7b",
"\\x7c",
"\\x7d",
"\\x7e",
"\\x7f",
"\\x80",
"\\x81",
"\\x82",
"\\x83",
"\\x84",
"\\x85",
"\\x86",
"\\x87",
"\\x88",
"\\x89",
"\\x8a",
"\\x8b",
"\\x8c",
"\\x8d",
"\\x8e",
"\\x8f",
"\\x90",
"\\x91",
"\\x92",
"\\x93",
"\\x94",
"\\x95",
"\\x96",
"\\x97",
"\\x98",
"\\x99",
"\\x9a",
"\\x9b",
"\\x9c",
"\\x9d",
"\\x9e",
"\\x9f",
"\\xa0",
"\\xa1",
"\\xa2",
"\\xa3",
"\\xa4",
"\\xa5",
"\\xa6",
"\\xa7",
"\\xa8",
"\\xa9",
"\\xaa",
"\\xab",
"\\xac",
"\\xad",
"\\xae",
"\\xaf",
"\\xb0",
"\\xb1",
"\\xb2",
"\\xb3",
"\\xb4",
"\\xb5",
"\\xb6",
"\\xb7",
"\\xb8",
"\\xb9",
"\\xba",
"\\xbb",
"\\xbc",
"\\xbd",
"\\xbe",
"\\xbf",
"\\xc0",
"\\xc1",
"\\xc2",
"\\xc3",
"\\xc4",
"\\xc5",
"\\xc6",
"\\xc7",
"\\xc8",
"\\xc9",
"\\xca",
"\\xcb",
"\\xcc",
"\\xcd",
"\\xce",
"\\xcf",
"\\xd0",
"\\xd1",
"\\xd2",
"\\xd3",
"\\xd4",
"\\xd5",
"\\xd6",
"\\xd7",
"\\xd8",
"\\xd9",
"\\xda",
"\\xdb",
"\\xdc",
"\\xdd",
"\\xde",
"\\xdf",
"\\xe0",
"\\xe1",
"\\xe2",
"\\xe3",
"\\xe4",
"\\xe5",
"\\xe6",
"\\xe7",
"\\xe8",
"\\xe9",
"\\xea",
"\\xeb",
"\\xec",
"\\xed",
"\\xee",
"\\xef",
"\\xf0",
"\\xf1",
"\\xf2",
"\\xf3",
"\\xf4",
"\\xf5",
"\\xf6",
"\\xf7",
"\\xf8",
"\\xf9",
"\\xfa",
"\\xfb",
"\\xfc",
"\\xfd",
"\\xfe",
"\\xff"
}:
Код: Выделить всё
PS D:\xoreos-tools-master\bin\Release> C:\Users\Estranger\source\repos\hexlify_test\x64\Release\hexlify_test.exe
hexlify3: 3171.61 nanoseconds
hexlify5: 8897.92 nanoseconds
PS D:\xoreos-tools-master\bin\Release> C:\Users\Estranger\source\repos\hexlify_test\x64\Release\hexlify_test.exe
hexlify3: 3767.41 nanoseconds
hexlify5: 56066.3 nanoseconds
PS D:\xoreos-tools-master\bin\Release> C:\Users\Estranger\source\repos\hexlify_test\x64\Release\hexlify_test.exe
hexlify3: 3814.16 nanoseconds
hexlify5: 58556.5 nanoseconds
PS D:\xoreos-tools-master\bin\Release> C:\Users\Estranger\source\repos\hexlify_test\x64\Release\hexlify_test.exe
hexlify3: 3811.47 nanoseconds
hexlify5: 55165.1 nanoseconds
Код: Выделить всё
PS D:\xoreos-tools-master\bin\Release> C:\Users\Estranger\source\repos\hexlify_test\x64\Release\hexlify_test.exe
hexlify3: 3102.93 nanoseconds
hexlify5: 2674.17 nanoseconds
PS D:\xoreos-tools-master\bin\Release> C:\Users\Estranger\source\repos\hexlify_test\x64\Release\hexlify_test.exe
hexlify3: 3125.44 nanoseconds
hexlify5: 2591.36 nanoseconds
PS D:\xoreos-tools-master\bin\Release> C:\Users\Estranger\source\repos\hexlify_test\x64\Release\hexlify_test.exe
hexlify3: 3495.8 nanoseconds
hexlify5: 2680.74 nanoseconds
Код: Выделить всё
/permissive- /ifcOutput "hexlify_test\x64\Release\" /GS /GL /W3 /Gy /Zc:wchar_t /Zi /Gm- /O2 /sdl /Fd"hexlify_test\x64\Release\vc143.pdb" /Zc:inline /fp:precise /D "NDEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /errorReport:prompt /WX- /Zc:forScope /std:c17 /Gd /Oi /MD /std:c++20 /FC /Fa"hexlify_test\x64\Release\" /EHsc /nologo /Fo"hexlify_test\x64\Release\" /Ot /Fp"hexlify_test\x64\Release\hexlify_test.pch" /diagnostics:column
Я был в отъезде и не заметил, что не скопировал и вставил массив. Флаги компилятора те же, в коде ничего не менялось, кроме этих дополнений, которые не должны влиять на функциональность кода.
Подробнее здесь: https://stackoverflow.com/questions/785 ... -functions
Мобильная версия