
Ievgenii
14.05.2018
15:09:17
Реально t.reserve(count); все разреливает
Хм...

Dmitry
14.05.2018
15:10:01
дефолтные не при чем, см. число живых/живших

Ievgenii
14.05.2018
15:10:34
Ну оно как-ты говоришь

Google

Ievgenii
14.05.2018
15:11:04
Он выделяет новую память и сразу, видимо, резервирует доп. элемент, в который вставляет после мой элемент
И из-за этого создается лишний элемент

Stanislav
14.05.2018
15:14:42
больше 100 сразу 125 выделяет )

Ievgenii
14.05.2018
15:17:53
Значит нужно всегда reserve делать, если знаешь новый размер...

Stanislav
14.05.2018
15:22:32
ты так дойдешь до статических массивов и ручным управлением памятью скоро :)

Ievgenii
14.05.2018
15:22:46
)))
Так даже перфоменс выше
Там, конечно, очень маленький прирост, но есть
Пусть себе как хочет это делает, если автор дает 100% горантию, что он знает, что он делает)
Не вижу в этом ничего плохого, пусть управляет руками той памятью, которой оперирует его либа
Найди "две" странности)))

Google

Stanislav
14.05.2018
15:28:50
10000381 это capacity?

Ievgenii
14.05.2018
15:29:01
да

Dmitry
14.05.2018
15:30:20
А я тут обнаружил, что винда рулит, а линукс отстой.
Если пишешь на D числодробилку.
Ибо LDC на винде творит чудеса. А в линуксе та же версия LDC не творит чудеса.
Вот простой тест с вычислениями синусов и косинусов:
https://gist.github.com/thedeemon/aba0ecc2607d781ebfe81c9fef144704
В линуксе LDC лишь процентов на 10 быстрее DMD.
А на винде разница в 4.4 раза!
Линуксовый бинарник работает 4.92 секунды.
Виндовый бинарник, собранный той же версией LDC, - 1.10 секунды!

Ievgenii
14.05.2018
15:30:30
Правда меня растроил факт, что кондишн чек в форе не кешируется :(

Dmitry
14.05.2018
15:30:42
Тут это микробенчмарк, а я столкнулся на реальной программе, где много синусов и косинусов считалось, помимо прочей вещественной арифметики. Там виндовый бинарник где-то вдвое быстрее линуксового оказался, если компилить LDC. А если компилять DMD, то разницы практически нет. На винде LDC-шный вариант большой проги в 6 раз быстрее DMD-шного. А на линуксе лишь в 2-3 раза быстрее, что тоже хорошо, но двое медленнее винды. Причем можно через Wine виндовый бинарник запустить, и он будет вдвое быстрее нативного линуксового. Такие вот чудеса. Похоже, дело в том, какой рантайм используется, реализация тригонометрии в виндовом LDC супершустрая.


Ievgenii
14.05.2018
15:32:05
Тут это микробенчмарк, а я столкнулся на реальной программе, где много синусов и косинусов считалось, помимо прочей вещественной арифметики. Там виндовый бинарник где-то вдвое быстрее линуксового оказался, если компилить LDC. А если компилять DMD, то разницы практически нет. На винде LDC-шный вариант большой проги в 6 раз быстрее DMD-шного. А на линуксе лишь в 2-3 раза быстрее, что тоже хорошо, но двое медленнее винды. Причем можно через Wine виндовый бинарник запустить, и он будет вдвое быстрее нативного линуксового. Такие вот чудеса. Похоже, дело в том, какой рантайм используется, реализация тригонометрии в виндовом LDC супершустрая.
/mnt/c/docker$ time ./test.exe 10000000
А я его без вайна запускаю)))))))))

Dmitry
14.05.2018
15:33:13
в какой системе?

Ievgenii
14.05.2018
15:33:47
/mnt/c$ uname
Linux
lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 16.04.4 LTS
Release: 16.04
Codename: xenial

Dmitry
14.05.2018
15:34:19
а как это работает без вайна?

Ievgenii
14.05.2018
15:34:23
))))
В винду интегрировали же ядро линухи)))
Вот просто запускаю баш и фигашу)
Можно как линуксовые, так и виндовые запускать

Dmitry
14.05.2018
15:34:57
ну так это винда тогда

Ievgenii
14.05.2018
15:35:15
С одной стороны да, но я могу использовать оба ядра
Вот я сейчас компилю под винду, а запускаю с линухи...
Извращение еще то)))
for(uint i=0; i<to!int(args[1]); ++i){
В этом случаи кондишн чек будет вычисляться каждый раз :(

Google

Ievgenii
14.05.2018
15:38:02
Думал что компилятор такое оптимизирует
Но нет

Pavel
14.05.2018
15:38:30

Ievgenii
14.05.2018
15:38:55
Сделал так:
uint count = to!int(args[1]);
for(uint i=0; i<count; ++i){
И это почти в 2 раза быстрее работает
при переданом 10М ввиде параметра
/mnt/c/docker$ time ./test.exe 10000000
10000000
10000381
END
real 0m0.574s
user 0m0.000s
sys 0m0.000s
/mnt/c/docker$ time ./test.exe 10000000
10000000
10000381
END
real 0m0.303s
user 0m0.000s
sys 0m0.000s

Dmitry
14.05.2018
15:40:27
ну так там вызов ф-ии, и компилятор не знает, вдруг она там на каждом вызове что-то важное и новое делает.
conv.to поди не помечена как pure
да если б и была, компиляторы редко умеют этим пользоваться

Ievgenii
14.05.2018
15:42:25
А если помечена, то что?

Dmitry
14.05.2018
15:42:52
в идеале, компилятор вызов чистой ф-ии мог бы вынести из цикла

Dmitry
14.05.2018
15:43:31
Но в том же LDC оптимизатор по сути сишный, он про чистые ф-ии не знает

Stanislav
14.05.2018
15:43:57
ну он еще должен чекнуть что ты не поменяешь args[1]

Dmitry
14.05.2018
15:44:43
да, тоже важно

Ievgenii
14.05.2018
15:44:54
Тоже верно
Ну, так или иначе - нужно выносить в переменную

Denis
14.05.2018
15:58:41
точнее не хак а АПИ

Google

Denis
14.05.2018
16:02:49

Oleg
14.05.2018
16:03:19

Denis
14.05.2018
16:06:41

Eto
14.05.2018
16:23:49

Denis
14.05.2018
16:24:08
apt-cache search openocd openocd - открытый внутрисхемный отладчик для систем ARM и MIPS

Pavel
14.05.2018
17:01:42
/// human-readable IP adress
@property
const (char)* addressStringz()
{
char[INET6_ADDRSTRLEN+1] str;
return inet_ntop(AF_INET6, &address, str.ptr, str.length);
}
Что если я верну указатель на массив char который был выделен на стеке во время работы функции. Он ведь не успеет сразу очиститься? =)

Stanislav
14.05.2018
17:07:51
опасненько

Pavel
14.05.2018
17:08:48
А впрочем да, я не успею даже следующим оператором распечатать полученную строку, так как она тут же затрется вызовом printf

Denis
14.05.2018
17:08:57

Admin
ERROR: S client not available

Denis
14.05.2018
17:09:03
на спичках экономишь

Pavel
14.05.2018
17:09:18
Надо понять, можно ли выделять 46 байт на стеке только в случае ошибки или придется делать это каждый раз

Pavel
14.05.2018
17:13:21
точнее не хак а АПИ
https://msdn.microsoft.com/ru-ru/library/windows/desktop/aa366527(v=vs.85).aspx
https://msdn.microsoft.com/ru-ru/library/windows/desktop/aa366796(v=vs.85).aspx
-и в винде найдётся

Oleg
14.05.2018
17:14:04
может просто передавать в функцию выделенную память?

Denis
14.05.2018
17:14:22
ну вот хз только насчёт его стабильности. как по мне так идея годная. у меня в разработке нет софта который требует больше 4гигов RAM

Oleg
14.05.2018
17:14:25
как на Си?

Denis
14.05.2018
17:14:33
выделять - дораха

Google

Denis
14.05.2018
17:14:35
)

Oleg
14.05.2018
17:14:50

Denis
14.05.2018
17:15:06
тогда по входу там мусор будет же

Oleg
14.05.2018
17:15:08
char[46] buffer;
auto result = myFunc(buffer[]);
да и вообще не 46, а 1024
чтобы любую строку можно было напечатать
и срез возвращать

Pavel
14.05.2018
17:20:33
Как то странно размер бинарника генерится. Был 28495 байт, а добавил эту распечтаку строк в двух местах и размер стал 32918 ?
Выравнивается по 4к чтоли
Ладно втопку, распечатаю просто 16-байтный адрес в лог, вот еще за пользователей переводить в human readable формат.

Denis
14.05.2018
17:23:56
перевод уже у нас встроен давно
велосипедишь

Pavel
14.05.2018
17:25:26
только не в betterC ;)

Oleg
14.05.2018
17:26:21

Pavel
14.05.2018
17:28:21
Да впринципе норм.. Но выглядеть это будет не очень структуриовано, если я буду во все функции пробрасывать кусочек буфера

Denis
14.05.2018
17:29:08
всё нормально будет, только не кусок буфера возвращай а это уже почти что честный аллокатор получится самобельный

Oleg
14.05.2018
17:29:42
ты же можешь буфер хранить в самой структуре
и просто учитывать что он перезаписывается
а возвращать его срез

Pavel
14.05.2018
17:30:25
Статически?

Oleg
14.05.2018
17:30:27
ну да