@dlangru

Страница 124 из 719
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
Я дебаге тока в шарпе децл юзал

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

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

qwe
10.02.2017
04:02:58
вундервафля? я написал строчек 20 кода, дебагер не осилил, брекпоинты в перегруженых операторах не ловяся, значения переменных не отображаются...
Дайте, пожалуйста, код и инструкцию как воспроизвести. Хочу на форум уже давно написать о проблемах дебаггера. У меня были проблемы с дебаггингом проекта DCD, но там несколько проектов по несколько тысяч строк, пока найду в какой части были проблемы потрачу много время.

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
ну в статье так написано...

Страница 124 из 719