@dlangru

Страница 67 из 719
Dmitry
06.09.2016
20:05:55
а какие к примеру нельзя совершить?

Eto
06.09.2016
20:24:03
Например, иногда ты не можешь посчитать количество элементов. Потому что последовательность будет поглощена. Тут правда есть небольшой трюк: auto countLength(Range)(Range range, ulong* capturedLength) if (isInputRange!Range) { static struct CountLength(R) { private R _original = void; private ulong* _count; this(R original, ulong* capturedLength) { _original = original; _count = capturedLength; } ulong count() @property const { return *_count; } ElementType!R front() @property { return _original.front; } bool empty() @property { return _original.empty; } void popFront() { if (!_original.empty) ++(*_count); _original.popFront(); } } return CountLength!Range(range, capturedLength); }

Google
Eto
06.09.2016
20:30:43
Затем, что иначе никак.

Oleg
06.09.2016
20:56:48
Затем, что иначе никак.
почему никак? можно создать просто поле и потом обращаться к нему через возвращаемый рэндж, а не через отдельную переменную

Eto
06.09.2016
21:00:42
Это структура, а не класс.

Oleg
06.09.2016
21:01:32
и чему это мешает?

сколько через неё седалали popFront, столько и будет count

или такое поведение не корректно для рассматриваемой задачи?

Eto
06.09.2016
21:02:20
сколько через неё седалали popFront, столько и будет count
Ага. К которому ты не можешь получить доступ.

Oleg
06.09.2016
21:02:32
да почему же?

Eto
06.09.2016
21:04:08
Потому что функция, которая работает с последовательностью, будет инкрементировать count в собственной копии обёртки. Которую ты потом не получишь.

Oleg
06.09.2016
21:05:17
понял, не корректно, просто я подразумевал именно подсёт файлов, который ранее приводился в примере

или такое поведение не корректно для рассматриваемой задачи?

Eto
06.09.2016
21:06:08
или такое поведение не корректно для рассматриваемой задачи?
В код посмотри. Там именно в popFront count и инкрементируется.

понял, не корректно, просто я подразумевал именно подсёт файлов, который ранее приводился в примере
Да, возможно будет работать и без указателя. Но зачем однобокие решения, которые работают только в некоторых случаях?

Google
Oleg
06.09.2016
21:12:10
Да, возможно будет работать и без указателя. Но зачем однобокие решения, которые работают только в некоторых случаях?
а, кстати, не будет) решение не однобокое, а "не использующее указатели для передачи результата из функции" работать не будет потому, что foreach копию делает

но не рабочее)

Eto
06.09.2016
21:12:47
Ну вот.

Oleg
06.09.2016
21:13:22
enumerate, кстати, есть

позволяет манипулировать индексами в алгоритмах из std.algorithm

Dmitry
07.09.2016
05:13:47
Щас доеду до работы хочу проверить. По идее мой вариант с повторным обращением к ленивой функции будет работать в два раза медленнее чем вариант Олега и на большом количестве файлов это будет видно (ну или бенчмарк вкорячить)

Блин, я подзабыл. Вот есть шаблонная функция: TickDuration[fun.length] benchmark(fun...)( uint n); на вход она принимает получается имя функции и количество раз которое ее выполнить нужно. тоесть если у меня функция: void foo() то ее выхов будет benchmark!foo(1), где 1 кол-во повторений. а вот как быть если у меня функция foo на входе принимает данные? тоесть: void foo(int x) то как мне ее вызывать то? Я помню там какая-то заморочка была, но щас упорно не могу вспомнить какая именно

Oleg
07.09.2016
08:46:25
Бенчмарк не принимает функции с аргументами, тебе нужно создать делегат, который будет без аргументов сам, но с аргументами вызвать твою функцию

Dmitry
07.09.2016
08:48:32
спаибо, а там почему оно так? В других языках такая же все обстоит?

Oleg
07.09.2016
08:49:01
Что всё?

Dmitry
07.09.2016
08:49:27
ну функции бенчмарка работают только через делегат

Oleg
07.09.2016
08:54:38
Причём тут язык собственно? Просто так придумали, ты можешь сам придумать функцию замера скорости

Ты привел код, где функция вычисляется 1 раз. Это бессмысленно в этой ситуации - лучше stopwatch воспользоваться. Бенчмарк для замера средней скорости существует и вызовов там должно быть минимум 50

Dmitry
07.09.2016
09:17:25
Нe просто так придумали наверно не на пустом месте-то. Тут получается именно средняя скорость посчитается? Почему один проход не резентативен?

Eto
07.09.2016
09:33:32
Это как проводить опрос только по одному человеку. Надо узнать мнения многих людей, чтобы можно было говорить о мнении людей.

Dmitry
07.09.2016
09:43:34
А почему некоторые вещи делают не как классы а как структуры? К примеру StopWatch

в чем преимущества?

qwe
07.09.2016
10:01:00
В D?

Dmitry
07.09.2016
10:01:05
угу

qwe
07.09.2016
10:01:30
структуры в D не наследуются, а экземпляры выделяются в стеке

Google
qwe
07.09.2016
10:02:04
то есть когда видишь структуру, ты совершенно точно знаешь, что у нее нет потомков

Eto
07.09.2016
10:02:18
Структуры можно хранить на стеке.

qwe
07.09.2016
10:02:28
это выразительно

ключевая особенность D

одна из

Dmitry
07.09.2016
10:03:05
а... тоесть могли бы теоретически сделать как класс finaly чтобы точно наследования не было

Eto
07.09.2016
10:03:05
то есть когда видишь структуру, ты совершенно точно знаешь, что у нее нет потомков
Плюс, вызовы методов структуры быстрее, чем вызовы методов класса.

Dmitry
07.09.2016
10:03:11
угу понял

а там разница вообще большая? Речь про проценты десятки процентов или в разы?

Max
07.09.2016
10:10:24
Если объявлять методы класса как final - её вообще не будет

Max
07.09.2016
10:10:37
https://dlang.org/spec/struct.html - полное сравнение

Dmitry
07.09.2016
10:15:00
Я что-то понять не могу. Как такое происходит: http://www.everfall.com/paste/id.php?sh17u3cca5pv казалось бы закоменченная функция auto cnt = files.count; должна повышать скорость, а не понижать ее

Oleg
07.09.2016
10:17:48
вот тут и нужна статистическая проверка

хотябы 50 результатов сравни

блин

да это вообще бессмысленные замеры же)

Dmitry
07.09.2016
10:19:14
подсчет содержимого папки C:\Windows\System32 это хорошая идея? или тоже какие-то нюансы могут быть?

да? Почему?

Google
Oleg
07.09.2016
10:19:30
ты обращаешься к диску

Dmitry
07.09.2016
10:19:52
он кэширует данные типа?

Oleg
07.09.2016
10:20:20
а диск может тупить (головка быть в другом месте), результаты могут закешироваться, так как твой поток уже обратился к данным это может влиять на кэш и тд

Oleg
07.09.2016
10:21:19
Dmitry
07.09.2016
10:21:43
короче ленивые функции нужны там где данные заведомо приходят с известной скоростью или же они уже есть в той же оперативной памяти так?

Admin
ERROR: S client not available

Oleg
07.09.2016
10:23:21
можно и так использовать, но изначально они не для этого

и вообще одно с другим не связано

@DmitryBubnenkov зачем тебе вообще там count, чего ты к нему прицепился?

тебе же в любом случае ходить по этому списку файлов, можно и самому счётчик написать

Dmitry
07.09.2016
10:27:10
да просто пытаюсь разобраться когда одно применять, а когда другое

Eto
07.09.2016
10:32:59
with count: 0.00372304 lazy: 0.183949 array: 0.0123614 У меня такой результат.

Dmitry
07.09.2016
10:34:24
А почему с count так мало то??

Eto
07.09.2016
10:34:49
Не знаю.

Google
Dmitry
07.09.2016
10:34:50
и почему ленивая итерация такой медленной оказалась?

ппц блин

Eto
07.09.2016
10:35:09
Это диск. Тут не угадаешь.

Dmitry
07.09.2016
10:37:03
Как по русски прочитать фразу: "dirEntries(...).array" точнее ее концовку. ... преобразует набор структур дирЭнтри в массив?

Eto
07.09.2016
10:38:00
Отложенную последовательность вычитывает в массив.

Dmitry
07.09.2016
10:39:10
"Отложенную последовательность вычитывает в массив." В простой массив или есть еще какие-то ленивые массивы?

Eto
07.09.2016
10:41:30
А вот результат без использования getSize в цикле: with count: 0.00301512 lazy: 0.00247268 array: 0.00272708

А вызов с .count работает так быстро потому что он поглощает последовательность и foreach не выполняется ни разу.

Как видишь теперь lazy-вариант выигрывает. Потому что все остальные варианты делают тоже самое, только ещё немного больше. (Хотя .count в этом случае мог бы быть и быстрее.)

Dmitry
07.09.2016
10:44:33
getSize короче получается как-то данные кэширует (или не он а драйвер так?)

Eto
07.09.2016
10:45:31
getSize в foo1 не вызывается _ни разу_.

Dmitry
07.09.2016
10:46:35
Э... почему??

auto x = file.getSize();

Eto
07.09.2016
10:46:44
Я выше написал почему.

Dmitry
07.09.2016
10:46:55
а в текущем варианте то?

понял

А что на счет вопроса: "Отложенную последовательность вычитывает в массив." В простой массив или есть еще какие-то ленивые массивы?

Eto
07.09.2016
10:49:33
Простой массив.

Dmitry
07.09.2016
10:50:23
т.е. который будет содержать уже все результаты обхода, а не как в ленивом случае так?

Eto
07.09.2016
10:51:01
Ну, естественно.

Dmitry
07.09.2016
10:53:53
array Returns a copy of the input in a newly allocated dynamic array. т.е. выделенный буфер для ленивых вычислений не трогается, и создается новая копия с полным набором данных. Как-то так получается? Просто под ленивый массив память то наверно оже резервируется или нет?

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