Как правильно использовать стек
Задался таким вот вопросом.
Как мне известно из различных ресурсов программирования, память которую мы используем из стека, работает на порядок быстрее сегмента данных. Мне стало интересно, как лучше использовать память стека и решил поиграться с профайлером от DC:
Код, который тестировался:
Открыть/закрыть
new String_64[64];
#define Prerequisites();
#define CodeSnippet0();\
TestCode1();
#define CodeSnippet1();\
TestCode2();
stock TestCode1() // Stack
{
goto label;
new string[64];
label:
for(new i; i < sizeof(string); i++) {
string[i] = i;
if(string[i] != i)
break;
}
}
stock TestCode2() // Data size
{
for(new i; i < sizeof(String_64); i++) {
String_64[i] = i;
if(String_64[i] != i)
break;
}
}
Обход инициализации массива сделал чтобы уравнять "соперников".
Результаты:
Тестирование: <Stack> vs <Data size>
Режим: интерпретируемый, 10000x1000 итераций.
Stack: 124646
Data size: 116586
Возможно конечно есть более правильная реализация кода для теста, но исходя из вышеизложенного примера, я как таковых преимуществ в использовании памяти стека не заметил, да еще при этом массив не инициализировался. В тесте хотел уместить сразу и запись и чтение.
Вопрос 1: Получается если мне нужно выводить диалог размером, скажем 2048*4 байт, то мне лучше отдать предпочтение сегменту данных?
Вопрос 2: Получается, лучше изначально выделить память в сегменте данных, скажем размерами 144, 256, 512... и уже пользоваться данной памятью, нежели постоянно выделять память в стеке?
UPD: Дополнение:
Какой из этих вариантов, будет лучше использовать?
stock OptionOne(playerid) {
new string[2048];
for(new i; i < 128; i++) {
format(string
, sizeof(string
), "%sКакой-то текст...\n", string
); }
ShowPlayerDialog(playerid
, 0, DIALOG_STYLE_MSGBOX, "caption", string
, "button1", "button2"); return 1;
}
new String_2048[2048];
stock OptionTwo(playerid) {
String_2048[0] = EOS;
for(new i; i < 128; i++) {
format(String_2048
, sizeof(String_2048
), "%sКакой-то текст...\n", String_2048
); }
ShowPlayerDialog(playerid
, 0, DIALOG_STYLE_MSGBOX, "caption", String_2048
, "button1", "button2"); return 1;
}