@dlangru

Страница 140 из 719
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
Готов глянуть выхлоп в llvm il из LDC
При выключенной оптимизации

Замыкание, это когда функция захватывает внешние переменные, и здесь этого нет.
Лямбда частный случай замыкания) можно и замыкание в цикл переделать

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
https://d.godbolt.org
Не, ассемблер сложно слишком, я только IL могу

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

учитывая что потом оптимизатор по нему проходит

Google
Oleg
24.03.2017
19:55:16
Там же переменная а ну это очевидно

А хотя

Да чтож так сложно то

Oleg
24.03.2017
19:56:07
только static не позволяет это собрать

не...

maxElement так себе выдаёт результат

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
222 ms, 116 μs, and 5 hnsecs 19 ms, 214 μs, and 2 hnsecs
Ну едрить твою налево!



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
ммм даа, но ldc2 вообще всё сжирает
Больше обьем итераций ставь и данных

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

Oleg
24.03.2017
20:07:36
но они появились в 2.073
вру, maxIndex появился

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: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 есть.

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