
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);
}

Oleg
06.09.2016
20:29:26
да и зачем указатель?

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

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

Google

Oleg
06.09.2016
21:12:10
но не рабочее)

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
угу понял
а там разница вообще большая? Речь про проценты десятки процентов или в разы?

qwe
07.09.2016
10:04:32

Oleg
07.09.2016
10:06:50

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
а диск может тупить (головка быть в другом месте), результаты могут закешироваться, так как твой поток уже обратился к данным это может влиять на кэш и тд

Eto
07.09.2016
10:20:38

Oleg
07.09.2016
10:21:19

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

Eto
07.09.2016
10:22:04

Oleg
07.09.2016
10:22:30

Eto
07.09.2016
10:23:13

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.
т.е. выделенный буфер для ленивых вычислений не трогается, и создается новая копия с полным набором данных. Как-то так получается?
Просто под ленивый массив память то наверно оже резервируется или нет?