
Maxim
24.03.2017
19:29:21
а вообще, в правильно заданном вопросе уже есть половина ответа, когда требования не ясны, получаются неясные решения)

Oleg
24.03.2017
19:30:42

Oleg
24.03.2017
19:30:58

Oleg
24.03.2017
19:31:16
а что можно тут оптимизировать?

Google

Oleg
24.03.2017
19:31:45
проход по массиву для поиска максимального: O(n)
тут может быть и нет волшебства... а вот в std.regex...

Oleg
24.03.2017
19:32:50
Замыкание не создавать, я просто с телефона ничего в лапше из кода не понял

Oleg
24.03.2017
19:33:35
а какое тут замыкание?
передаваемая лямбда?

Oleg
24.03.2017
19:34:04
Да

Shorty(Ale Chapa) Manskiy
24.03.2017
19:34:29
Ты хочешь сказать что волшебный Ди нифига не волшебный?
private T extremum(alias map, alias selector, T)(T[] arr)
{
alias mapFun = unaryFun!map;
alias selectorFun = binaryFun!selector;
auto extremElementMapped = mapFun(arr[0]);
auto extremElement = arr[0];
foreach (const i; 1 .. arr.length) {
auto mapElement = mapFun(arr[i]);
if (selectorFun(mapElement, extremElementMapped)) {
extremElementMapped = mapElement;
extremElement = arr[i];
}
}
return extremElement;
}
T minElement(alias map = "a", T)(T[] arr)
{
return extremum!(map, "a < b")(arr);
}
T maxElement(alias map = "a", T)(T[] arr)
{
return extremum!(map, "a > b")(arr);
}
это примерный код для массивов.
магия....

Oleg
24.03.2017
19:34:37
Замыкание же тоже можно передать разве нет?

Oleg
24.03.2017
19:34:54
тут уже в другую часть надо посмотреть
замыкание не соптимизировать отказавшись от него
но вот создаваемая из строки функция может быть и не будет замыканием
template unaryFun(alias fun, string parmName = "a")
{
static if (is(typeof(fun) : string))
{
static if (!fun._ctfeMatchUnary(parmName))
{
import std.traits, std.typecons, std.meta;
import std.algorithm, std.conv, std.exception, std.math, std.range, std.string;
}
auto unaryFun(ElementType)(auto ref ElementType __a)
{
mixin("alias " ~ parmName ~ " = __a ;");
return mixin(fun);
}
}
else static if (needOpCallAlias!fun)
{
// Issue 9906
alias unaryFun = fun.opCall;
}
else
{
alias unaryFun = fun;
}
}

Eto
24.03.2017
19:37:38
Разве компилятор не вправе переделать код, чтобы было оптимальнее?

Google

Oleg
24.03.2017
19:37:40
вот тут моя наука кончается и я до конца не знаю что будет из auto unaryFun(ElementType)(auto ref ElementType __a)

Maxim
24.03.2017
19:38:45
берем, компилятор, берем objdump, прогоняем obj через objdump, смотрим, что там на ассемблере)
если кому не лень будет, расскажите, что там получится)

Oleg
24.03.2017
19:41:07
Чур мне лень!
Но
Готов глянуть выхлоп в llvm il из LDC

Shorty(Ale Chapa) Manskiy
24.03.2017
19:41:33
Да
Замыкание, это когда функция захватывает внешние переменные, и здесь этого нет.

Oleg
24.03.2017
19:41:45

Oleg
24.03.2017
19:42:33

Shorty(Ale Chapa) Manskiy
24.03.2017
19:43:59
я про то, что замыкание != лямбда. По тому что он написал можно подумать что это так,

Oleg
24.03.2017
19:45:13
LDC же умеет IL выгонять?

Shorty(Ale Chapa) Manskiy
24.03.2017
19:49:51
https://d.godbolt.org

Oleg
24.03.2017
19:50:01
-output-ll Write LLVM IR

Oleg
24.03.2017
19:50:44
import std.stdio;
import std.functional;
static pure nothrow @nogc @safe int foo(alias f)(int a) { return f(a); }
void main()
{
auto xx = foo!(unaryFun!"a*2")(21);
writeln(xx);
int z = 12;
auto yy = foo!(a => a + z)(33);
writeln(yy);
}
первый вызов foo компилируется, второй нет

Oleg
24.03.2017
19:51:04

Oleg
24.03.2017
19:51:19
так что maxElement должен выдавать достаточно хороший код
учитывая что потом оптимизатор по нему проходит

Oleg
24.03.2017
19:54:45
А сорь

Google

Oleg
24.03.2017
19:55:16
Там же переменная а ну это очевидно
А хотя
Да чтож так сложно то

Oleg
24.03.2017
19:56:07
только static не позволяет это собрать
не...
maxElement так себе выдаёт результат

Oleg
24.03.2017
19:59:56

Oleg
24.03.2017
19:59:59
import std.stdio;
import std.algorithm;
import std.range;
import std.random;
import std.array;
import std.datetime;
import std.conv;
void main()
{
auto arr = iota(3000).map!(a => uniform(0,1000)).array;
void f1() { auto b = arr.maxElement; }
void f2()
{
auto b = arr.front;
foreach (v; arr)
if (b < v) b = v;
}
auto p = benchmark!(f1, f2)(10_000);
writeln(p[0].to!Duration);
writeln(p[1].to!Duration);
}
dmd -O maxelemtest.d
222 ms, 116 μs, and 5 hnsecs
19 ms, 214 μs, and 2 hnsecs

Oleg
24.03.2017
20:00:41
:С

Shorty(Ale Chapa) Manskiy
24.03.2017
20:00:59
а если c -inline?

Oleg
24.03.2017
20:01:19
лол
62 ms, 161 μs, and 3 hnsecs
33 ms, 136 μs, and 9 hnsecs

Oleg
24.03.2017
20:01:41
Ы

Shorty(Ale Chapa) Manskiy
24.03.2017
20:01:59
какая версия компилятора?

Oleg
24.03.2017
20:02:13
DMD64 D Compiler v2.073.2
linux
похоже на баг, имхо

Google

Eto
24.03.2017
20:02:42
DMD очень не очень в генерацию кода... Есть другие компиляторы для теста?

Oleg
24.03.2017
20:02:57
Даёшь LDC!

Oleg
24.03.2017
20:03:01
ммм даа, но ldc2 вообще всё сжирает
1 hnsec для обоих функций
на -O4
на -O1 только можно

Shorty(Ale Chapa) Manskiy
24.03.2017
20:04:38
в последней версии в phobos что-то связанное с min max -Element делали.

Oleg
24.03.2017
20:04:46
конечно
добавили вроде
в ldc2-1.1.0 их нет

Admin
ERROR: S client not available

Shorty(Ale Chapa) Manskiy
24.03.2017
20:05:04
нет именно чинили что-то.

Oleg
24.03.2017
20:05:05
в 1.2.0-beta1 есть

Shorty(Ale Chapa) Manskiy
24.03.2017
20:05:14
я про DMD

Oleg
24.03.2017
20:05:32
не помню, вроде в changelog'ах не было

Shorty(Ale Chapa) Manskiy
24.03.2017
20:05:42
было.

Oleg
24.03.2017
20:05:43
но они появились в 2.073

Oleg
24.03.2017
20:06:27
Было бы странно если бы LDC не сказал что всё фигня давайте нормально всё сделаем чтобы сразу ответ)

Oleg
24.03.2017
20:07:36

Google

Oleg
24.03.2017
20:07:43
В этом жеж суть его SSA трансформаций
@DmitryBubnenkov инфа что лучше юзать LDC

Oleg
24.03.2017
20:08:58
в 2.072.0 появились maxElement

Shorty(Ale Chapa) Manskiy
24.03.2017
20:09:44
v2.074.0-master-259c1b6
dmd t_xusfc1ao -O -release -inline -mcpu=native
54 ms, 449 μs, and 7 hnsecs
55 ms, 273 μs, and 2 hnsecs

Oleg
24.03.2017
20:09:50
и потом в changelog'ах нет ничего

Shorty(Ale Chapa) Manskiy
24.03.2017
20:10:30
нет, гдето есть.

Oleg
24.03.2017
20:10:46

Oleg
24.03.2017
20:10:54
да вроде давно уже
а бля
не прочёл
хм
ну, значит в 74 что-то делали
до 73.2 никаких упомянаний
вот только когда ldc будет 74ой версии...
чёрт, только что не было на сайте беты
уже появилась)
https://dlang.org/changelog/2.074.0.html#std-algorithm-searching-extremum

Shorty(Ale Chapa) Manskiy
24.03.2017
20:16:03
нет.

Oleg
24.03.2017
20:16:03
а то можешь сейчас по быстрому релиз добавил?)
ну бету всмысле

Shorty(Ale Chapa) Manskiy
24.03.2017
20:16:19
http://nightlies.dlang.org/dmd-nightly/dmd.master.windows.7z
там гдето и для linux есть.