@dlangru

Страница 163 из 719
Oleg
28.04.2017
10:19:43
и там обработка происходит

запись же должна как-то блокировать базу

если ты с двух-трёх потоков будешь писать в базу одновременно, то прироста не должно быть

Dmitry
28.04.2017
10:20:20
а база на уровне таблиц блокируется обычно?

Google
Oleg
28.04.2017
10:20:28
я хз

Maxim
28.04.2017
10:20:29
я бы протестировал на ограниченном наборе данных

Dmitry
28.04.2017
10:20:52
ладно потом тогда как будет время потестирую)

Oleg
28.04.2017
10:21:01
если ты с двух-трёх потоков будешь писать в базу одновременно, то прироста не должно быть
если это не так и база умеет как-то классо паралелить запись, то будет прирост

а по описанию твоей программы там особо то и не ускориться

Oleg
28.04.2017
10:25:49
Я так и не понял что ты тут имеешь ввиду %)
если ты хочешь писать вот так infof("some data %s", data); то нужно использовать перезапись переменной sharedLog иначе с твоим fLogger нужно будет писать так fLogger.infof("some data %s", data); и если есть библиотека, которая сама логирует что-то, то она точно ничего не будет знать о твоём fLogger само наличие глобальной переменной fLogger не заставляет переводить в неё всё логирование

Dmitry
28.04.2017
10:26:22
ай! все спасибо! теперь понял!

а бывает вообще что либа что-то логирует? Т.е. я просто никогда не видел что бы в доке было написано, что-то про логирование. Обычно только про исключения пишут.

Объект sharedLog он всегда один получается?

Google
Oleg
28.04.2017
10:29:19
а так много библиотек что-то логируют

и причём достаточно обильно в зависимости от флагов

Dmitry
28.04.2017
10:30:00
т.е. нужно лишь логер объявить и оно дальше будет писать все из всех либ?

Oleg
28.04.2017
10:30:13
нет

во первых глобальная переменная sharedLog объявлена он в std.experimental.logger и тебе объявлять не нужно

во вторых если в библиотеке нет логирования, то оно не появится

оно должно как-то включаться

если оно есть

Dmitry
28.04.2017
10:33:16
static this() { sharedLog = new FileLogger("ProcessingLog.txt"); } void main() { вот так норм?

Oleg
28.04.2017
10:33:54
да

Pavel
28.04.2017
10:44:22
если ты с двух-трёх потоков будешь писать в базу одновременно, то прироста не должно быть
Прирост может быть, субд ведь сами очень много продвинутых инструментов параллельной обработки имеют. Они годами проектируются с рассчетом на много одновременных подключений.

Oleg
28.04.2017
10:44:50
ну может быть

Pavel
28.04.2017
10:45:04
По крайней мере постгрес с этим очень плотно дружит

Я бы даже попробовал одновременно писать и читать несколько десятков треков

qwerty
28.04.2017
10:50:55
Никто не знает. Если функция вложенная, может ли она быть pure? char[] process() pure { char[] res = ['a', 'b', 'c']; return res; } immutable char[] buf = process(); Этот кусок кода внутри метода. Но не дает скомпилировать, потому что не может преобразовать char[] к immutable char[], однако если вынести функцию process за пределы метода, то компилируется как ожидалось.

Oleg
28.04.2017
10:52:02
можно делать pure

но что-то смахивает на косяк

то что он даёт char[] к immutable char[]

qwerty
28.04.2017
10:53:20
если pure то так можно

pure гарантирует, то что результат не присвоен к какой-то глобальной переменной или статическому полю

Google
qwerty
28.04.2017
10:54:21
говорю, что если метод вынести (т. е. он перестанет быть вложенным), то это работает

pure на самом деле не совсем это гарантирует

Oleg
28.04.2017
10:54:45
вот только хотел написать

qwerty
28.04.2017
10:54:52
ага

Oleg
28.04.2017
10:55:34
а массив res изменяется внутри process?

qwerty
28.04.2017
10:57:03
а массив res изменяется внутри process?
я написал код, который передает суть проблемы. Можно на него смело опираться

Oleg
28.04.2017
10:57:39
тогда можно смело idup делать после вызова process

qwerty
28.04.2017
10:58:04
можно, но я могу делать это же и без pure

Oleg
28.04.2017
10:58:14
и это тоже верно

я вот сейчас подумал и понял, что не понимаю что должно произойти вообще по логике с таким расскладом

сборщик же не должен использоваться для литералов?

qwerty
28.04.2017
10:59:29
о_О

Oleg
28.04.2017
10:59:29
где тогда выделяется массив?

qwerty
28.04.2017
10:59:38
аа

Oleg
28.04.2017
10:59:44
если на стеке, то возвращать его из функции это как-то не хорошо

а если в куче (и сборщик всё-таки используется), то это не pure же тогда получается

так как этот участок памяти можно изменить

или тогда он должен создавать каждый раз новую память

надо проверить

qwerty
28.04.2017
11:00:46
Google
qwerty
28.04.2017
11:01:21
ладно, я на форум стукну

Oleg
28.04.2017
11:02:46
литерал использует gc

каждый раз выделяется новая память

вообще неявное приведение к immutable должно блокироваться системой типов

qwerty
28.04.2017
11:03:49
для pure не должно

в книжке у Ruppe написано

и на Dconf 2013 в докладе Ali есть информация

Oleg
28.04.2017
11:05:06
тоесть если из pure функции возвращается какая-то область памяти, то явно указтель на неё один и можно сделать её immutable?

в этом логика?

qwerty
28.04.2017
11:05:45
да

Admin
ERROR: S client not available

Oleg
28.04.2017
11:06:35
если метод process объявить внутри другого как static то всё работает

даже без pure

qwerty
28.04.2017
11:07:02
литерал использует gc
То есть если сделать так char[] buf; buf.length = 3; buf[0] = 'a'; buf[1] = 'b'; buf[2] = 'c'; То GC не вызовется?

Oleg
28.04.2017
11:07:06
что достаточно странно

buf.length = 3; перевыделяет память

qwerty
28.04.2017
11:07:56
?

Oleg
28.04.2017
11:10:37
не понял юмора

я про литерал массива думал, но по всей видимости используется gc для динамических массивов всегда

Google
Oleg
28.04.2017
11:12:08
int[] a = [1,2,3]; будет использовать gc int[3] a = [1,2,3]; не будет

qwerty
28.04.2017
11:13:38
int[3] a = [1,2,3]; так совсем не интересный(

нельзя вместо размера указать переменную

Oleg
28.04.2017
11:16:54
Ну это понятно

Dmitry
28.04.2017
13:52:02
а разве нельзя сделать так. скомпилить, переименовать исполняемый файл в том же каталоге в app2 запустить его, начать доработку проекта и скомпилировать его под app1. у меня при этой попытке ругается что не может получить доступ к app1 хотя app1 файла такого даже нет. Есть только app2

причем опять линкер ругается

а в Ди есть какие-то фишки с тем, что при касте float в стринг происходит округление? конкретно проблема и типов Variant который БД возвращает. point[3].coerce!string округляет значение до 3 знака, а оригинальное содержит в себе 6 знаков

writeln(point[3].coerce!float); тоже возвращает: 56.0512 Вместо 56.051151

Dmitry
28.04.2017
16:15:38
думаешь? но вроде тип используется дишный для данных

Я проверил: void main() { Variant b = 56.051151; float x = b.coerce!float; writeln(x); } >56.0512

Александр
28.04.2017
16:36:51
А если вывести просто 56.051151?

Dmitry
28.04.2017
16:36:55
Хотя я не понял. Там еще Algebraic а Variant вроде бы с закруглением %)

Проблема в том, что БД возвращает Variant

Александр
28.04.2017
16:40:08
Может он в выводе округляет

Реально там вообще может быть 56.05115100000267499502

Dmitry
28.04.2017
16:48:57
блин, все разобрался. проблема в том, что writeln проводит округление

или нет %)

короче нужно отдохнуть

а то уже тупить начал

а хотя вроде да %)

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