Re[32]: Пример
От: Qbit86 Кипр
Дата: 09.07.18 23:04
Оценка:
Здравствуйте, vdimas, Вы писали:

V>
V>namespace ConsoleApp2
V>{
V>    public interface IMyEnumerable<T, out TEnumerator> //: IEnumerable<T>
V>        where TEnumerator : struct, IMyEnumerator<T> {
V>        TEnumerator GetEnumerator();
V>    }

V>    public interface IMyEnumerator<out T> {
V>        T Current { get; }
V>        bool MoveNext();
V>        void Reset();
V>    }
V>


В интерфейсе IMyEnumerable констрейнт struct для энумератора надо убрать, он не нужен на этому уровне, неоправданно жёсткое ограничение. При желании/необходимости его можно всегда можно навесить позже в алгоритмах, которые работают через IMyEnumerable. Чтобы для клиента, использующего эти абстракции, struct был опцией, а не требованием.

Интерфейс же IMyEnumerator можно пофиксить от родовой травмы, применив более идиоматичный заменитель maybe/опциона:
public interface IMyEnumerator<out T>
{
    bool TryMoveNext(out T current);
    void Reset();
}
Глаза у меня добрые, но рубашка — смирительная!
Re[3]: 2D-Linq и оптимизация цифровых фильтров - 3
От: vdimas Россия  
Дата: 09.07.18 23:32
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Остаётся найти, в каком месте Span<T> можно проинициализировать в адрес i-той строки массива.


    float[,] m = {{ 1, 2 }, { 3, 4 }};

    fixed (float* f = &m[0, 0]) {
        var span = new Span<float>(f, 2);
    }


Правда, в этом сценарии span уже не нужен.
Re[6]: 2D-Linq и оптимизация цифровых фильтров - 3
От: vdimas Россия  
Дата: 09.07.18 23:37
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Это когда баг в Dеbug найти не удается (или он там почему-то не проявляется)


Память в дебаге обнуляется в MSVC++.
И это реальная неприятность.

Хорошо помогает этот же код отлаживать в Linux под valgrind-ом.
Сейчас можно прямо из Студии — всё то же самое: брейкпоинты, переменные, стеки, потоки и т.д.
Замечательно в дебаге все баги проявляются.

Докер, SSH на стороне контейнера, в Студии прописывается адрес/порт для подключения, создаётся проект для Linux (их несколько видов) и гоу.
Re[33]: Пример
От: vdimas Россия  
Дата: 09.07.18 23:50
Оценка:
Здравствуйте, Qbit86, Вы писали:

Q>В интерфейсе IMyEnumerable констрейнт struct для энумератора надо убрать, он не нужен на этому уровне, неоправданно жёсткое ограничение. При желании/необходимости его можно всегда можно навесить позже в алгоритмах, которые работают через IMyEnumerable. Чтобы для клиента, использующего эти абстракции, struct был опцией, а не требованием.


Тут на вкус и цвет.
В своём коде я часто делаю именно так для целей контроля, бо свои интерфейсы я чаще всего прописываю именно и только для value-типов и соотв. генерик-алгоритмов.
И мы как раз обсуждаем, как убежать от боксинга в Linq.

Я лишь хотел показать в каком месте linq навернётся.
От ограничения struct там ничего не меняется.


Q>Интерфейс же IMyEnumerator можно пофиксить от родовой травмы, применив более идиоматичный заменитель maybe/опциона:

Q>
Q>public interface IMyEnumerator<out T>
Q>{
Q>    bool TryMoveNext(out T current);
Q>    void Reset();
Q>}
Q>


Теперь foreach такое проглатывает?
Я что-то упустил?
Если нет, то подобного рода идиоматичность можно выразить через методы-расширения.
Re[33]: Пример
От: vdimas Россия  
Дата: 09.07.18 23:57
Оценка:
Здравствуйте, Qbit86, Вы писали:

Q>В интерфейсе IMyEnumerable констрейнт struct для энумератора надо убрать, он не нужен на этому уровне, неоправданно жёсткое ограничение.


Вдогонку — а какой тогда вообще в констрейне смысл, когда он один, если не для value-type? ))
Для ref-типов можно расписать прямо на интерфейсах — это будет в точности то же самое, что на констрейнах, только писанины поменьше.
Re[27]: 2D-Linq и оптимизация цифровых фильтров - 3
От: vdimas Россия  
Дата: 10.07.18 00:11
Оценка: :)
Здравствуйте, samius, Вы писали:

S>Специально перечитал посты Синклера. Идея сравнения скорости двумерного массива с одномерным — не его.


Его, его. ))
У двумерного массива для доступа к элементу вызываются специальные методы класса-массива.
А в случае одномерного массива компилятор подставляет тупо опкоды со смещением по индексу.
Вот Синклер и подменил одно на другое (в числе прочего).
Эта фишка известна еще с забытых 2003-х годов.
Отредактировано 10.07.2018 0:14 vdimas . Предыдущая версия .
Re[32]: Аллокации
От: vdimas Россия  
Дата: 10.07.18 00:24
Оценка:
Здравствуйте, Danchik, Вы писали:

I>>>Расскажи лучше, из за чего Linq тормозит. А то vdimas, alex_public и многие другие уверены, что из-за рефлексии, но не могут ни показать, не доказать

S>>Расскажи, в каком конкретно случае и с чем именно сравниваем. А то мне за весь Linq как-то сложно отдуваться.
D>Думаю становится третим КО не стоит. Им толкуют об одном, а они обсусоливают очевидные вещи о другом.

О каком КО речь? Похоже, ты до сих пор не понял сути спора.

Так шта, давай уж я немного побуду для тебя КО — Синклер ускорил свой пример в основном за счёт оптимизации доступа к двумерному массиву.
Задача эта по-своему благородная, но не имеет отношения конкретно к Linq, на что я сразу же и указал:
http://www.rsdn.org/forum/dotnet/7187266.1

Поэтому, далее я поэкпериментировал в этом же направлении, показав, что подобные техники могут быть полезны и при "обычной" записи алгоритма, безо-всякого Linq.
Теперь прояснилось? ))
Re[30]: 2D-Linq и оптимизация цифровых фильтров - 3
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 10.07.18 05:11
Оценка:
Здравствуйте, vdimas, Вы писали:

I>>Так ты расскажи про ту часть, где рефлексия тормозит


V>Интерпретирование всегда тормозит.


Общие слова.

I>>и почему linq2db этого избежал


V>А он избежал?


Именно.
Re[7]: 2D-Linq и оптимизация цифровых фильтров - 3
От: Pavel Dvorkin Россия  
Дата: 10.07.18 07:26
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Память в дебаге обнуляется в MSVC++.


ЕМНИП не обнуляется, а туда какой-то код заносится, чтобы он по возможности исключение генерировал при попытке использовать неинициализированное значение. Помню, там что-то вроде 0xbdbdbdbd где-то было.
With best regards
Pavel Dvorkin
Re[28]: 2D-Linq и оптимизация цифровых фильтров - 3
От: Sinclair Россия https://github.com/evilguest/
Дата: 10.07.18 09:00
Оценка: :)
Здравствуйте, vdimas, Вы писали:

V>Здравствуйте, Ikemefula, Вы писали:


V>>>Давай дождёмся когда развенчает. ))

I>>Уже. Вдвое ускорил, это мало ?

V>Задачу зато не решил.

V>Я не могу взять произвольный алгоритм из этого же класса и воспользоваться его "наработками".
Можешь.
Вот так записывается c8-усреднение:
from d in data select (d[-1, -1]+d[-1, 0]+d[-1, 1]
                       d[ 0, -1]+         d[ 0, 1]
                       d[-1, -1]+d[ 1, 0]+d[ 1, 1])/8;

А вот так — усреднение "по горизонтали":
from d in data select (d[0, -2]+d[0, -1]+d[0, 0]+d[0, 1]+d[ 0, 2])/5

Было бы интересно посмотреть на "произвольный алгоритм из этог же класса", который не получится взять и воспользоваться.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[33]: Пример
От: Sharov Россия  
Дата: 10.07.18 09:53
Оценка:
Здравствуйте, Qbit86, Вы писали:

Q>Интерфейс же IMyEnumerator можно пофиксить от родовой травмы, применив более идиоматичный заменитель maybe/опциона:

Q>
Q>public interface IMyEnumerator<out T>
Q>{
Q>    bool TryMoveNext(out T current);
Q>    void Reset();
Q>}
Q>


Как это решит проблему?
Кодом людям нужно помогать!
Re[34]: Пример
От: Qbit86 Кипр
Дата: 10.07.18 10:01
Оценка:
Здравствуйте, Sharov, Вы писали:

S>Как это решит проблему?:xz:


Это смотря какую. Я думал, речь шла про сделать с нуля свою независимую иерархию базовых компонентов вместо существующей стандартной, и базировать алгоритмы на ней. Если так, то в новой переписанной версии нет смысла повторять ошибки существующей легаси.
Глаза у меня добрые, но рубашка — смирительная!
Re[31]: 2D-Linq и оптимизация цифровых фильтров - 3
От: vdimas Россия  
Дата: 10.07.18 10:02
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>>>и почему linq2db этого избежал

V>>А он избежал?
I>Именно.

С чем сравнивал?
Re[8]: 2D-Linq и оптимизация цифровых фильтров - 3
От: vdimas Россия  
Дата: 10.07.18 10:38
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>ЕМНИП не обнуляется, а туда какой-то код заносится, чтобы он по возможности исключение генерировал при попытке использовать неинициализированное значение. Помню, там что-то вроде 0xbdbdbdbd где-то было.


Предлагаю прогнать на своей рабочей Студии вот это:
#include <iomanip>
#include <iostream>

class Base {
private:
    size_t i;
};

class Derived : Base {};

template<typename T>
void test() {
    using namespace std;

    T * t = new T();
    cout << "new T():  " << hex << setfill('0') << setw(sizeof(size_t) * 2) << *(size_t*)t << std::endl;
    T * t1 = t;
    delete t1;
    cout << "delete t: " << hex << setfill('0') << setw(sizeof(size_t) * 2) << *(size_t*)t << std::endl;


    t = new T;
    cout << "new T:    " << hex << setfill('0') << setw(sizeof(size_t) * 2) << *(size_t*)t << std::endl;
    t1 = t;
    delete t1;
    cout << "delete t: " << hex << setfill('0') << setw(sizeof(size_t) * 2) << *(size_t*)t << std::endl;
}

int main()
{
    using namespace std;

    cout << "Base:" << std::endl;
    test<Base>();

    cout << std::endl;
    
    cout << "Derived:" << std::endl;
    test<Derived>();

    return 0;
}

Мои результаты:
Debug:
Base:
new T():  0000000000000000
delete t: dddddddddddddddd
new T:    cdcdcdcdcdcdcdcd
delete t: dddddddddddddddd

Derived:
new T():  0000000000000000
delete t: dddddddddddddddd
new T:    cdcdcdcdcdcdcdcd
delete t: dddddddddddddddd


Release:
Base:
new T():  0000000000000000
delete t: 0000000000000000
new T:    6e69575c32336d65
delete t: 6e69575c32336d65

Derived:
new T():  0000000000000000
delete t: 0000000000000000
new T:    4620004300000000
delete t: 4620004300000000
Отредактировано 10.07.2018 10:45 vdimas . Предыдущая версия .
Re[29]: 2D-Linq и оптимизация цифровых фильтров - 3
От: vdimas Россия  
Дата: 10.07.18 10:42
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>А вот так — усреднение "по горизонтали":


Опять непонимающего включил...
Так что там у нас с краевыми эффектами?
Один эффект на всех? ))
Re[35]: Пример
От: vdimas Россия  
Дата: 10.07.18 10:44
Оценка:
Здравствуйте, Qbit86, Вы писали:

Q>Это смотря какую. Я думал, речь шла про сделать с нуля свою независимую иерархию базовых компонентов вместо существующей стандартной, и базировать алгоритмы на ней. Если так, то в новой переписанной версии нет смысла повторять ошибки существующей легаси.


Да ХЗ насчёт ошибок легаси.
В твоей версии значение берется всегда, даже когда оно не нужно на очередной итерации.
Re[29]: 2D-Linq и оптимизация цифровых фильтров - 3
От: IB Австрия http://rsdn.ru
Дата: 10.07.18 10:49
Оценка: 22 (2) +2 -1 :)
Здравствуйте, vdimas, Вы писали:

V>Это у тебя сейчас рвануло, как обычно.

Ты так смешно ведешься, что не возможно удержаться =)

V>Иначе бы он не напорол ошибок еще в первом же сообщении.

Ошибок, кроме тебя, в этом топике пока никто не делал. А тебе удалось посадить их пяток в одном сообщении, от алгоритмических до синтаксических. И чем громче ты пытаешься перевести стрелки на Антона, тем заметнее становится, кто на самом деле налажал. А так как у тебя не хватает тормозов во время остановиться, то мы еще долго будем наблюдать за феерией "я вовсе не это имел ввиду", "да вы ни фига не понимаете" и "я тут один молодец", до тех пор, пока не надоест тебя стебать

V>Скажи, неужели бока обещанного "решения" не были тебе видны еще с самого первого поста?

С самого первого твоего поста в этот топик, отчетливо видно следующее:
— ты не умеешь внимательно читать или намеренно интерпретировал контекст так, чтобы было с чем докопаться до собеседника.
— ты намеренно скрываешь детали своих утверждений, чтобы потом оставалось пространство для маневра, а то как доходит до деталей, то сразу вылезают ошибки от которых сложно отмазаться.

V>В отличие от синклера я как раз решил именно ту задачу — покрыл целый класс похожих алгоритмов.

Задача была сформулирована даже не Антоном, а alex_public. Антон эту задачу процитировал в самом первом сообщении. И при решении этой задачи ты конкретно на косячил.
И ни какие отмазки этот факт не замажут. Так что, друг мой, да, в твоем решении алгоритмические ошибки, как бы ты не изворачивался.

V>Т.е. тебе опять двойка за неумение читать код.

От кого и хула похвала =)

V>Более того, ни в одном сообщении не указал, что у меня есть полный аналог кода Синклера, бо для соревнований нужны оба решения, ес-но, не только моё.

Для решения указаной задачи, чужой код не нужен. Можешь ее решить красиво? Код в студию, посмотрим, оценим и если твой подход действительно будет удачнее — признаем твою правоту.

V>Я наехал на Синклера за его нечестность.

Подозреваю, что тот Синклер в твоей голове с которым ты споришь, не имеет никакого отношения к Антону. Но то что тебе на самом деле просто "тон" не понравился, ты признался уже давно.
Натурально, как дурная девица в критические дни =)
Мы уже победили, просто это еще не так заметно...
Re[36]: Пример
От: Qbit86 Кипр
Дата: 10.07.18 11:00
Оценка:
Здравствуйте, vdimas, Вы писали:

V>В твоей версии значение берется всегда, даже когда оно не нужно на очередной итерации.


Зато нельзя обратиться к Current, не позвав TryMoveNext(). То есть их зависимость выражена синтаксически. В крайнем случае, можно добавить перегрузку TryMoveNext() без параметров.
Reset() я бы тоже выкинул.
Глаза у меня добрые, но рубашка — смирительная!
Re[30]: 2D-Linq и оптимизация цифровых фильтров - 3
От: Sinclair Россия https://github.com/evilguest/
Дата: 10.07.18 11:03
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Опять непонимающего включил...

V>Так что там у нас с краевыми эффектами?
А что с ними не так?
V>Один эффект на всех? ))
Конечно. Не требовать же вручную единички прибавлять.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[9]: 2D-Linq и оптимизация цифровых фильтров - 3
От: Pavel Dvorkin Россия  
Дата: 10.07.18 12:30
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Предлагаю прогнать на своей рабочей Студии вот это:


<skipped>

Слишком сложно . Запусти вот это

int main()
{
    int *px = new int;
    printf("%x\n", *px);
    return 0;
}


Outpuit : cdcdcdcd
With best regards
Pavel Dvorkin
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.