Из "накоженного":
serialize(stream, value.value.value);
if (value.value.value)
serialize(stream, value.value.kind);
serialize(stream, value.value.value);
if (value.value.value)
serialize(stream, value.value.kind);
Смотрю код высоконагруженного сервера. В ядре обсчёта вижу код типа:Меня аж передернуло.
func() {
ObjectGame* OG=MainOG;
while(OG->next!=NULL)
{
ia=(int*)OG+12;
i=*ia;
/*что-то делает*/
*ia=i;
/* код функции, внутри функции ia претерпевает различные изменения*/
OG=OG->next;
}
}
С большими глазами иду к прогеру, который это всё написал. Спрашиваю: почему он не пользуется методами Set и Get, и вообще, почему именно 12 байт?
На что он мне отвечает: «Внутри кода функции есть ветвящийся цикл, в котором перебираются многие параметры объекта. Если пользоваться методами Set и Get, а это переход по адресу, причём у каждого объекта он свой, конвейер процессора офигеет и сбросится. Это плюс 30 тактов на каждый переход. Всего таких объектов в секунду надо обсчитать порядка нескольких миллионов. Частота ядра — три миллиарда операций в секунду. Отсюда вывод: идите вы лесом со своим ООП!»
struct lib_foo * lib_foo_new(/*параметры*/); void lib_foo_free(struct lib_foo*);даже если это
struct lib_foobar {
int fb_foo;
int fb_bar;
};
Соответственно, все обьекты выделяются через malloc в хипе, в том числе и члены членов членов членов главной структуры. lib_foo_list * fill_foo(...) {
lib_foo_list * foos = lib_foo_list_new();
fill(foos->foo_list, ...)
return foos;
}
lib_bar_list * fill_bar(...) {
libbar_list * bars = lib_bar_list_new();
fill(bars->bar_list, ...)
return bars;
}
lib_baz_list * fill_baz(...) {
libbaz_list * bazs = lib_baz_list_new();
fill(bazs->baz_list, ...);
return bazs;
}
которую не засунуть в шаблон.
clear_foo: lib_foo_free(foo); clear_bar: lib_bar_free(bar); return err;а нечто позапутанней с дополнительными return-ами или goto-ми
sum x = x * n * (n + 1) `div` 2 where n = 999 `div` x solve = sum 3 + sum 5 - sum (3*5)
add x acc = if even x then acc + x else acc
fib a b acc = if b > 4000000 then acc else fib b b' acc'
where b' = a + b
acc' = add b acc
solve = fib 1 1 0
3 Пытался делать через решето Эратосфена. Тупит. Тупой брутфорс сразу дал ответ
source = 600851475143
divide s x | s == x = x | s `mod` x == 0 = divide (s `div` x) x | otherwise = divide s (x + 2) solve = divide source 3