
Dmitry
09.02.2017
11:12:56
И если я 1000 потоков вызову, то получается на каждый поток по 100 кб будет выделено или нет?
А если мы память выделяем через malloc:
auto m = malloc(1000_000_00);
то она сразу после старта резервировться должна или там тоже не все так просто?
Просто у меня потребление памяти приложением почему-то не меняется после конструкции выше

Grigirii
09.02.2017
11:41:15
операционка выделяет память при первой записи в неё, а не на malloc. пройдись и обнули и всё будет

Google

Dmitry
09.02.2017
11:42:40
а как обнуление вышлядит? Мне нужно указатель создать и им как-то пройтись?

Grigirii
09.02.2017
11:43:35
malloc уже вернул указатель, правда нетипизированный. обычно при исользовании malloc принято сразу кастовать в нужный тип
ну а имея указатель обычный for (size_t i = 0; i < size; ++i)
а зачем тебе malloc? что такого специфичного хочется, что GC память не устраивает?

Dmitry
09.02.2017
11:45:01
Просто пока разбираюсь как оно работает.
auto m = malloc(1000_000_00);
for (size_t i = 0; i < size; ++i)
{
m[i] = 0;
}
Я херню написал?

Grigirii
09.02.2017
11:47:09
да :)
size_t size = 10_000_000;
ubyte* m = cast(ubyte*)malloc(size);
for (size_t i = 0; i < size; ++i)
{
m[i] = 0;
}
нет дишного компилятора под рукой, но как-то так

Dmitry
09.02.2017
12:11:09
А зачем кастить память в тип? По умолчанию она в null? И что будет если не в ubyte кастануть?

Grigirii
09.02.2017
12:11:21
будет void*
а m[i] будет отсчитывать не i байт от начала, а i* sizeof(void*) байт, что равно 4 или 8 в зависимости от архитектуры
адресная арифметика коварна, не стоит пытаться использовать malloc не понимая её

Google

Grigirii
09.02.2017
12:13:36
эта та самя часть про которую говорят "C - сложный язык, там указатели"

Сергей
09.02.2017
12:23:12
ага,
А потом видят что-то типа char** и в неокрепшем организме происходит паническая атака :)

Grigirii
09.02.2017
12:24:14
ну это лучше чем char * const *, который даже С++ программисты читают вспотыкаясь

Сергей
09.02.2017
12:25:39
сложное заклинание :D

Grigirii
09.02.2017
12:26:42
хотя это уже не про указатели, а про способ объявления типов. в D с этим гораздо проще благодаря транзитивности конста и возможности расстановки скобочек после const
const(char*) * всё же лучше выглядит

Dmitry
09.02.2017
12:28:18
sizeof(void*) это равно размерности указателя для архитектуры? Просто я погуглил говорят что воид нулевой размерности

Сергей
09.02.2017
12:29:34
:)
типа памяти не занимает :)
можно харнить бесконечное количество указателей? :)
void это одно
void* это другое

Dmitry
09.02.2017
12:31:23
Второе указатель который можно к любому типу привести?

Сергей
09.02.2017
12:31:43
угу

Dmitry
09.02.2017
12:49:59
Почему мы кастуем к указателю на тип, а не не просто к типу?

Grigirii
09.02.2017
12:50:38
malloc возвращает указатель на выделенную память

Сергей
09.02.2017
12:50:52
ну у тебя есть дебагер? скасти к типу и спосмотри на результат)

Grigirii
09.02.2017
12:54:12
я сейчас посоветую очень странную вещи, многие могут не согласится, но попробуй попрограммировать на Brainfuck. Уникальный язык из 8 операторов, который мне дал мне не просто понимание работы с памятью, а внутреннее ощущение работы с ней
стоит написать тривиальную работу с массивами на bf и C перестаёт быть сложным

Dmitry
09.02.2017
12:56:01
Я дебаге тока в шарпе децл юзал

Мерлин
09.02.2017
13:11:38
Или вот

Grigirii
09.02.2017
13:12:07
да, асм тоже хорош для этих целей

Google

Grigirii
09.02.2017
13:12:31
для меня когда-то в bf был порог входа ниже. Да и фана больше

qwe
10.02.2017
04:02:58

Dmitry
10.02.2017
09:57:11
Dcd ни у кого с включенным пунто свитчером не падает?
В саблайме
Хотя у меня и без него падает...

Pavel
10.02.2017
10:30:15
Кто-нибудь писал одновременно синхронный и асинхронный код ? Это вообще реально?
Хочется чтобы как в go, без всяких yield он сам переключался на другие таски, если запущен асинхронно, и работал как обычно если синхронно.

Grigirii
10.02.2017
10:39:59
я нечто подобное делал на С++. все функции пытаются найти общий event loop, если его нет, значит синхронный мод, а значит каждая внутри себя запускает луп и ждёт его завершения

Oleg
10.02.2017
10:41:13
кстати насчтё eventloop'ов, кто-нибудь юзал vibe'овский вместе с gtk-d ?

Pavel
10.02.2017
10:55:25
Я хочу написать библиотечку небольшую, и чтобы она работала универсально
vibed будет слишком толсто тянуть как зависимость, то есть это все должно опираться максимум на стандартную библиотеку.

Dmitry
10.02.2017
10:56:59
А как без yield ведь непонятно как таск можно выполнять. Можно ли его запустить на квант времени или он долго будет что то молотить

Grigirii
10.02.2017
11:00:30
единственный вариант, который я вижу - делать колбечный интерфейс. то есть на каждую операцию, которая может быть асинхронной либа должна звать колбек, который эту операцию выполняет. Ну и соответственно 2 адаптера - под vibe.d и без него. Можно колбеки заменить на объект, удовлетворяющий интерфейсу

Мерлин
10.02.2017
11:02:19
В го же не магия, там время отдаётся другим горутинам во время операций с io и работой с каналами

Pavel
10.02.2017
11:04:42
Пичально, но нет, свой рантайм писать желания нету :)

Grigirii
10.02.2017
11:06:02
а что должна делать библиотека? как много асинхронных операций надо в ней делать?

Pavel
10.02.2017
11:06:54
Да это апи клиент http

Grigirii
10.02.2017
11:09:00
ну тогда вынеси в отдельный интерфейс запрос к http и проси объект его реализующий. вызов всегда выглядит синхронным, а то, что в vibe.d он там внутри пощёлкает корутинами не важно.

Dmitry
10.02.2017
11:33:55
Чем загрузить потоки и файберы чтобы их под нагрузкой протестировать?

Google

Oleg
10.02.2017
11:34:38
а что тебе дадут результаты теста?

Dmitry
10.02.2017
11:34:59
Ну понять к примеру могу ли я 1000 потоков организовать или нет
И будут ли файберы тормозить если в них что то считать

Oleg
10.02.2017
11:35:21
1000 потоков это глупо

Dmitry
10.02.2017
11:35:39
Просто тупо для изучения
Чтобы лучше разобраться

Oleg
10.02.2017
11:35:51
поток на ядро нужно расчитывать, иначе будет много издержек на переключения

Admin
ERROR: S client not available

Dmitry
10.02.2017
11:36:05
Вот я это и хочу проверить
Мне не ясно сколько процентов времени будет на переключение уходить

Oleg
10.02.2017
11:37:16
файберы... что именно ты хочешь в них считать?
ускорения ты не получишь от того, что начал в 1000 файберов расчитывать 1000 разных частей задачи
можно просто все части запустить последовательно
а ускорение можно получить за счёт многопоточности
но вот только пока не упрёшься в кол-во ядер
дальше не будешь получать

Dmitry
10.02.2017
11:59:30
Я хочу попробовать два кейса. В первом в файбере запускать вычисления. Во втором кучу тормозных операций типа доступа к БД

Сергей
10.02.2017
12:02:37
Тормозное подключение к БД это проблема БД, а не твоего кода
у тебя тут только 1 выбор, открыть в начале несоклько подлючений, и использовать их по кругу

Dmitry
10.02.2017
12:28:07
Я понимаю. Я просто хочу искусственные ситуации обыграть чтобы на практике убедиться.

Google

Dmitry
10.02.2017
12:28:33
Кстати диспетчер задач память в хипе показывает только или еще и в стеке?
В доке ошибка? https://dlang.org/library/core/stdc/stdlib/malloc.html
У меня оно тока uint ест
А там пишут что ulong
Или оно архитектурно зависимое? uint если я не туплю это 512mb?

Oleg
10.02.2017
18:54:20
uint это 32 бита
По логике должно хавать size_t
А он уже в свою очередь меняет размер от архитектуры

Dmitry
11.02.2017
07:31:35
Олег, можно ли говорить, что в документации ошибка или это там какой-то более глубокий смысл? Просто я когда на это все смотрю думаю "может это просто я чего-то там не понимаю"

Сергей
11.02.2017
08:08:17
Ну посмотри исходник stdlib.d
void* malloc(size_t size);

Dmitry
11.02.2017
09:30:08
auto m = cast(ubyte)malloc(100_000);
for(size_t i; i<size_t.max; i++)
{
m[i] = 0;
}
Error: only one index allowed to index ubyte

Сергей
11.02.2017
09:33:58
Ты скастил указатель в ubyte?
Почему ты создаешь 100000
А бежишь по size.max

Dmitry
11.02.2017
09:34:36
я так и не понял зачем его кастить...
у него же размер от архитектуры зависит

Сергей
11.02.2017
09:37:27
Влом объяснять, читай что такое указатель

Dmitry
11.02.2017
09:38:06
ok
"указатель - переменная, содержимым которой является адрес другой переменной"
Тоесть получается указатель всегда равен размеру той переменной на котоhe. он указывает?

Сергей
11.02.2017
12:13:08
Не другой переменной, а адресу памяти

Dmitry
11.02.2017
12:13:37
ну в статье так написано...