Страницы: 1 2 След.
RSS
Тесты. Как быстро закрасить ячейки, AddressCut / AddressToMaxRanges. Функция для резки одного длинного адреса на блоки максимальной длины (~ 255 символов) с преобразованием в диапазоны
 
Приветствую!

Основная задача: найти наибыстрейший метод для закрашивания ячеек
Подзадача: Поработать над универсальностью (передал аргумент для обработки и не паришься)
Модуль «Macro»
Модуль «Func»
Итоги
Развитие темы
Изменено: Jack Famous - 22.04.2021 09:28:09
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Функция для резки одного длинного адреса на блоки
Тесты. Как быстро закрасить ячейки
Какая связь?
 
vikttur, уже поменял местами. Связь такая, что эта функция используется, чтобы закрашивать ячейки максимально быстро. То есть пример демонстрирует преимущество функции
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
брать части строки в переменные - плохая идея, если строка состоит из миллионов символов
Я тебе еще в первой теме в первом сообщении это написал. На что ты отвечал что работа в VBA со строками очень быстра и т.д., но не будем поднимать, как говорится.
Цитата
Jack Famous написал:
Задача: определить баланс между удобством и скоростью работы при закрашивании ячеек
Плохая формулировка, кто будет определять, в каком решении лучше баланс? Вот, скорость она объективна, а баланс это субъективное понятие. У каждого свой баланс, как выяснили по трем предыдущим темам. Давай стенд и на скорость?
«Бритва Оккама» или «Принцип Калашникова»?
 
bedvit, ну стэнд готов в файле. Жду
Про строки Виталь, ну сколько можно - и там, и тут работа со строками, просто тут более правильно и сильно быстрее. Хватит уже с "я же говорил"
Изменено: Jack Famous - 16.03.2021 18:31:58
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Завтра гляну, что можно сделать. Может уже и так максимально быстро.
«Бритва Оккама» или «Принцип Калашникова»?
 
bedvit, хорошо, если получится ещё заметно быстрее
Только сразу прикидывай, если нужно будет собирать не 1, а несколько диапазонов и красить в разные цвета, как в ColorMap (кстати, я обновил)
Считать длину накопленный строки и укрупнять в цикле, как было у тебя с Select'ом должно быть медленнее, но ХЗ, как на самом деле получится
Изменено: Jack Famous - 16.03.2021 18:51:45
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
Только сразу прикидывай, если нужно будет собирать не 1, а несколько диапазонов и красить в разные цвета,
Алексей, ты бы сразу написал все условия задачи, а то я сделаю строго по задаче, а не то, что тебе хотелось бы :)
Изменено: bedvit - 16.03.2021 18:57:02
«Бритва Оккама» или «Принцип Калашникова»?
 
bedvit, делай так, а потом посмотрим
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Удалось ещё ускориться
объём не позволяет достоверно узнать, насколько (процесс резки занимает сотые доли секунды, что соизмеримо с погрешностью), поэтому готовлю ещё 2 теста: 4 раза по 250k отдельных ячеек разными цветами (миллион) и то же самое, но не отдельных ячеек, а диапазонов по 10 ячеек в каждом

UPD: 4 массива по 250 тыс адресов отдельных ячеек режет за 0,15-0,16 сек (сбор адресов - 2,2 сек)
Разница в скорости всё также незаметна (очень быстро, но при закрашивании количество блоков очень важно, ведь это размер цикла, так что посмотрим)

ВАЖНО: закрашивание 1 млн отдельных ячеек 4мя разными цветами "в лоб" занимает всего 11-12 сек (на 0,5 - 1 сек дольше, чем закрашивание "в лоб" одним цветом 500 тыс ячеек). Это очень быстро, при этом ,как говорит дядь медведь, это "тупой код" (простой и не требующий выпендрёжа типа моих функции для резки)  :D  :idea:

UPD2: закрашивание "укрупнённых" диапазонов занимает ~2,7-2,9 сек (4*250k single cells), что в итоге даёт общее время (сбор + резка + окраска) в ~ 5 секунд, что более, чем в 2 раза быстрее, чем "в лоб"
Ускорения, описанные под спойлером дали прирост в скорости этого теста на 0,2-0,3 сек — незаметно, но стабильно и с ростом объёмов будет гарантированно увеличиваться  :idea:

UPD3 (4*250k ranges, 10 cells each range): метод "в лоб" с результатом в 21,5 сек против 7,5 сек (3 сбор адресов + 4,5 резка и окрашивание) теперь отстаёт почти в 3 раза
Изменено: Jack Famous - 17.03.2021 11:45:37
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Твои результаты:
Get Adr:      2,3 sec
Paint simple: 15,6 sec
BlocksFromAddress:          3,039 sec
RangesFromAddress:          2,797 sec
PaintFromAddress:           2,973 sec
Total:        8,813 sec


Мои:
bedvit Total: 4,73 sec

Почти в 2 раза быстрее.

Файл прилагаю.
И вместо 8 функций, одна маленькая :)
Скрытый текст
Изменено: bedvit - 17.03.2021 12:57:04
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
bedvit: Твои результаты: … Total: 8,813 sec
старые, наверное, сейчас 4,08 на твоих условиях (диапазоны по 10 ячеек со втрой строки и до конца каждую втору строку) — не выиграл (твой результат также 4,7 показал у меня)
Цитата
bedvit: вместо 8 функций, одна маленькая
обрати внимание, что опять ты начинаешь считать символы (тебе платят за это или место в редакторе экономишь ?) и опять неверно, т.к. функций всего 2 (сбор адресов и резка адресов) + 1 основная тестовая процедура:
    • сбор адресов можно запихнуть в тестовую процедуру, но удобнее вызывать отдельно, т.к. у меня уже больше 6ти вариантов тестирования
    • резку запихать, конечно тоже можно, но это уже контпродуктивно - это отдельная функция для вызова, откуда угодно (писал про модульный подход в ColorMap, где ты мне так и не ответил по готовому решению)

Скоро выложу полный тестовый стенд с различными вариантами закрашивания: при количестве цветов более одного и/или расположении ячеек в разных столбцах/строках (шахматка) твой метод "отфильтровал-закрасил" сильно отстанет — будешь продолжать соревнование?

Чтобы ты понимал, я не создаю искусственные условия, чтобы победить, но как раз наоборот: в реальности (в той же ColorMap) нужно выделять диапазоны по всему листу и разными цветами. Для моей функции это вообще не проблема и она выдаст примерно линейный рост времени работы при увеличении количества участвующих в окрашивании ячеек ,а количество цветов ей вообще без разницы, ведь всё, что она делает, это резка строки адреса на блоки максимально возможной длины (<=255 символов) для создания адреса — типа Union'а, но в десятки/сотни раз быстрее
Создал отдельный файл, чтобы тебя ничего не отвлекало
P.S.: зачем такие пропуски между строками?…
Изменено: Jack Famous - 17.03.2021 14:50:55
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
обновил СС и добавил таблицу сравнения; все тесты, какие хотел, провёл; конкурентов по скорости пока нет
Следующей темой будет выделение ячеек (на основании победившего варианта резки строк RangesFromAddress)
Изменено: Jack Famous - 18.03.2021 09:03:36
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
конкурентов по скорости пока нетСледующей темой будет выделение ячеек (на основании победившего варианта резки строк RangesFromAddress)
Конкурентов пока нет - 0,8 сек.

прочие аутсайдеры:
bedvit Total: 5,089844
Adr by bedvit:              2,3 sec
bedvit color: 2,863 sec
Time total:   5,168 sec

Следующей темой будет выделение ячеек (на основании победившего варианта обработки ячеек XLLbuttonSelectCells)
Скрытый текст

К сожалению очень не оптимизированный, т.к. пришлось подключить СОМ (функция AutoWrapX) - а это долго.
Вот мой вариант сравнения, см. видео
Изменено: bedvit - 17.03.2021 17:30:06
«Бритва Оккама» или «Принцип Калашникова»?
 
bedvit, если ты перешёл на С++, значит идеи кончились, как я понимаю  :D
Безусловно, с ним тягаться смысла нет - какой же смысл в демонстрации…
Изменено: Jack Famous - 17.03.2021 17:30:51
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Jack Famous, почему, мой вариант спокойно соперничает с твои и обгоняет
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
bedvit: мой вариант спокойно соперничает с твои и обгоняет
на C++? На VBA решения будут?
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Я же выше выложил, не смотрел? Пост 11
На видео пост 14, видно что паритет, иногда выигрывает иногда проигрывает. На видео выигрывает (бывает что и проигрывает). Для универсально твой метод с хорошей скоростью, здесь соглашусь. Пили и развивай дальше :)
Изменено: bedvit - 17.03.2021 18:14:12
«Бритва Оккама» или «Принцип Калашникова»?
 
bedvit, мои 4,08 против твоих 4,7 - это выигрыш?
К тому же это лучший вариант для твоего способа - то есть при увеличении цветов или шахматке он сильно проиграет
Изменено: Jack Famous - 17.03.2021 18:16:36
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
какой же смысл в демонстрации
смысл в демонстаюрации двух методов на VBA (мой, твой) и третьего в xll
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
bedvit написал: мои 4,08 против твоих 4,7 - это выигрыш?
да мои 5.09 быстрее твоих 5.2 (ты видео смотрел?)
Притом я думаю, что здесь паритет, а в связи с тем, что ты позиционирует свое решение, как универсальное, а я свое узкоспециализированное, твой вариант вполне интересен.
Изменено: bedvit - 17.03.2021 18:22:53
«Бритва Оккама» или «Принцип Калашникова»?
 
bedvit, не смотрел - у меня на работе нельзя
Ты уклоняешься: даже в идеальных для твоего способа условиях, мы, можно сказать, наравне. Приближая примеры к жизни, от твоего способа придётся отказаться, т. к. фильтровать всё подряд не вариант, не говоря уже о том, что ты вставляешь данные в ячейки
Есть идеи, куда пилить-то?)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Куда мне уклонятся, я уже не презывного возраста :) Быстрое решение под задачу - пожалуйста. А пилить комбайн - нет времени
Цитата
Jack Famous написал:
Есть идеи, куда пилить-то?)
Проверил свои старые наработки, универсальные, что то вроде твоих - твои быстрее. Поэтому идея одна - переходить на xll, и пилить на порядок быстрее.
«Бритва Оккама» или «Принцип Калашникова»?
 
bedvit, твои наработки в библиотеке не имеют конкурентов, но вот работать с ними не так просто. Например, на работе, регистрацию библы не пропустят - потому и извращаюсь, выжимая максимум)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
bedvit написал:
Конкурентов пока нет - 0,8 сек.
Теперь в серьезных аутсайдерах.
Новое время: 0,08 сек.
Более чем в 60 раз быстрее VBA.


Что доработано:
1.НЕ используется стандартный UNION и НЕ используется SpecialCells.
Написал свою реализацию, которая на 2,6% дает больше блоков (Areas),что плохо, но работает на порядки! быстрее, что очень хорошо.
Вот как выглядит результат
2.Используются стандартные функции C API для выбора нужного диапазона, определения последней ячейки
3.Создана функция поиска в данных ареалах, с учетом задаваемых условий сравнения пользователем (компаратора).

И как итог, проверка работоспособности:

Комментарии к числам на последнем рисунке:
Выделено ячеек (весь лист) - 17 179 869 184 (17 млрд.)
Найдено ячеек удовлетворяющих условию - 18 748 739 (всего 25 столбцов по 1 млн.ячеек=25 млн. ячеек)
Создано Areas - 4 688 249 (моя, самописная UNION)
Создано стеков (массив XLOPER12 (xltypeRef), по 32 767 Areas в каждом) - 144
Время выполнения: 8,3 секунды

За раз выделяется/закрашивается 1 стек (32 767 Areas), но пока через СОМ, через C API пока не удалось сделать быстрее (очень мало данных, материалов почти нет, по крупицам собираю)

Жаль, что не с кем поделится наработками.
Изменено: bedvit - 30.03.2021 13:12:22
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
bedvit: Жаль, что не с кем поделится наработками
чойта не с кем? А как же я?))) Владимир ZVI тоже в теме - я писал ему  :)
Ну то, что C выиграет в разы я не сомневался, так что поздравляю тебя с очередным крутым инструментом для своей библиотеки и найденным решением  :idea:

Я так понимаю, что в VBA у меня конкурентов пока нет?  :)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
Я так понимаю, что в VBA у меня конкурентов пока нет?
Думаю, что ты уже максимально выжал, для меня, нет смысла что-то там оптимизировать еще.
Цитата
Jack Famous написал:
Владимир ZVI тоже в теме - я писал ему
Да он мне писал, пригласил его в клуб XXL :)
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
bedvit: пригласил его в клуб XXL
звучит, как общество жирдяев  :D
Жду его - отправь ссылку на группу прям
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Jack Famous, bedvit, приветствую.

Предложу решения по ускорению кода на VBA (с xll соперничать нету смысла и некорректно), но для начала немного декомпозиции:

Алгоритм можно разделить на 3 пункта (рассматривала решение Jack Famous - Time total: 3,270 sec):
  1. Получение адресов нужных ячеек и формирование одномерного массива;
  2. Формирование единой строки с адресами (через Join);
  3. Блочная закраска нужных диапазонов.
Цитата
Важно: Данное решение и так достаточно хорошо отрабатывает, тем более данная операция в большинстве случаев будет требоваться максимум 1 раз! Поэтому ниже представленная оптимизация, по факту не требуется, и представлена чисто с целью предоставить альтернативное решение!

Предложение по оптимизации 1 пункта (Результат 0,3, взамен 1,6):
Скрытый текст


2 пункт и 3 пункт без оптимизации (P.S. К успеху шла, но не получилось, не фартануло!):
Скрытый текст

Итог: Шалость удалась только с пунктом №1 (Итоговое время упало до 2,023)! В остальных случаях оптимизация не имеет смысла, т.к. Jack Famous, уже, на мой взгляд, выжал максимум + идёт упор на объектную модель, где программисты на VBA особой власти не имеют (остается только перебирать реализованные методы Microsoft или пользовательские надстройки и библиотеки на сторонних языках, если основная цель - это максимальная производительность в вычислениях).

Jack Famous, FILE_RangesFromAddress 👍
Изменено: Aнaстaсия - 25.09.2023 10:39:51
 
Aнaстaсия, здравствуйте! Спасибо за внимание к теме!
Цитата
Aнaстaсия: Предложение по оптимизации 1 пункта: Получение адресов нужных ячеек и формирование одномерного массива
ну, непосредственно к теме этот пункт как раз отношения не имеет, т.к. это подготовительный этап. Вот моя тема по сбору, но она очень замусорена…
    Ускорить получение адреса, можно, используя координаты 1ой (левой верхней ячейки) области и размер области. Строку адреса получаем вручную, получая литеры столбцов с помощью функций (в конце) из этой моей темы. Можно ещё протестировать ручное получение адреса R1C1 (там литеры столбцов не нужны), но, по моему, это медленнее в итоге будет…

P.S.: спойлеры использованы отлично! Им можно давать имена, если что, чтобы понимать, что они скрывают  ;)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Страницы: 1 2 След.
Наверх