О быстродействии Basic

Автор sokol92, 28 января 2022, 19:37

0 Пользователи и 1 гость просматривают эту тему.

sokol92

Добрый день!
В ходе работы с LO Basic периодически возникают вопросы, связанные с быстродействием.

Тест1.

Sub TestFormat
 Dim i As Long, t As Long, v
 t = getSystemTicks
 For i = 1 To 100000
   v = Format(i, "DD.MM.YYYY")
   'v=sin(i)
 Next i
 MsgBox getSystemTicks - t
End Sub


У меня (Win 10 LO 7.2.5.2) тест проходит за 30 сек.

Если заменить Format на sin (не самая простая функция), то получается 0,2 сек. Разница в быстродействии не понятна, поскольку обе функции написаны на "C".

Для справки: в Excel тест с синусом проходит практически мгновенно, c Format - 0,06 сек.

P.S. В этой теме благодаря Михаилу удалось существенно продвинуться вперед.  :)
Владимир.

eeigor

Цитата: sokol92 от 25 апреля 2020, 16:28Спасибо, как всё, оказывается, интересно!
Да, действительно. Сам порой копаюсь...
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

mikekaganski

Цитата: sokol92 от 28 января 2022, 19:37Если заменить Format на sin (не самая простая функция), то получается 0,2 сек. Разница в быстродействии не понятна, поскольку обе функции написаны на "C".

Хехе.
sin - практически тривиальна, есть процессоры, у которых есть специальная инструкция.

А Format - это аццкий ужас. Я удивляюсь, что она вообще отрабатывает быстрее, чем холодный старт винды (кстати, реализованный на низкоуровневом C и ассемблере).
С уважением,
Михаил Каганский

sokol92

Вы будете долго смеяться, но

Sub TestFormat2
  Dim i As Long, t As Long, v
  Dim oFA
  oFA = createUnoService( "com.sun.star.sheet.FunctionAccess" )
  t = getSystemTicks
  For i = 1 To 100000
    v=oFA.callFunction("TEXT", Array(i, "DD.MM.YYYY"))   
  Next i
  MsgBox getSystemTicks - t
End Sub


выполняется за 9 секунд.

В Excel обращение к функциям рабочего листа вместо "родных" дает замедление минимум на порядок (что понятно).
Владимир.

mikekaganski

С уважением,
Михаил Каганский

mikekaganski

#5
Проверил в ЛО 7.3.0.2. Не могу воспроизвести Ваше соотношение.

TestFormat даёт 3191.
TestFormat2 даёт 12779.

А 7.2.0.4 даёт практически то же время для TestFormat2, и в 10 раз больше для TestFormat - так что мы что-то исправили в цикле 7.3.
С уважением,
Михаил Каганский

mikekaganski

С уважением,
Михаил Каганский

sokol92

#7
Здравствуйте, Михаил!
Проверил еще раз на чистом профайле, непосредственно скопировав тексты макросов из этой темы.
TestFormat: 32017, TestFormat2: 9101.
Version: 7.2.5.2 (x64) / LibreOffice Community
Build ID: 499f9727c189e6ef3471021d6132d4c694f357e5
CPU threads: 6; OS: Windows 10.0 Build 19042; UI render: Skia/Vulkan; VCL: win
Locale: ru-RU (ru_RU); UI: ru-RU
Calc: threaded


Куда-то исчезло Ваше замечательное исправление функции Basic Replace. Если сейчас запускать тест из этого сообщения, то у меня время около минуты.

В этой версии Replace отрабатывает за 121 сек ("медленная" виртуальная машина):
Version: 7.2.5.2 / LibreOffice Community
Build ID: 20(Build:2)
CPU threads: 4; OS: Linux 5.4; UI render: default; VCL: gtk3
Locale: en-US (en_US.UTF-8); UI: en-US
Ubuntu package version: 1:7.2.5~rc2-0ubuntu0.20.04.1~lo1
Calc: threaded
Владимир.

mikekaganski

#8
Цитата: sokol92 от 29 января 2022, 15:38Проверил еще раз

Я же написал, что это исправлено в 7.3.

Цитата: sokol92 от 29 января 2022, 15:38Если сейчас запускать тест из этого сообщения, то у меня время около минуты.

У меня подозрение, что могло сыграть роль исправление для учёта Unicode... Нет.
С уважением,
Михаил Каганский

sokol92

На 3-й машине работает быстро (9 сек. на "медленной" виртуалке):
Версия: 6.4.7.2
ID сборки: 1:6.4.7-0ubuntu0.20.04.1+ci202105111545+astra3
Потоков ЦП: 4; ОС: Linux 5.4; Отрисовка ИП: по умолчанию; VCL: kf5;
Локаль: ru-RU (ru_RU.UTF-8); Язык интерфейса: ru-RU
Calc: threaded


В принципе, у меня есть и другие подобные тесты - систематизирую и буду тестировать новые версии.
Владимир.

mikekaganski

Цитата: sokol92 от 29 января 2022, 15:38Если сейчас запускать тест из этого сообщения, то у меня время около минуты.

https://git.libreoffice.org/core/+/7e5c9220ef5d51ac23e618c5c9eeda9cf4339c88 ... да, в конце концов всё равно завязано на Unicode.
С уважением,
Михаил Каганский

sokol92

#11
Для TestFormat скорость в 3 секунды в ожидаемой версии LO 7.3, наверное, правильная по порядку (для текущего варианта LO Basic). Если в TestFormat записать эквивалентную конструкцию так:

v=Mid(100 + Day(i), 2) & "." & Mid(100 + Month(i), 2) & "." & Year(i)

то скорость выполнения у меня в Win 10 составляет 1,4 сек.
Владимир.

mikekaganski

Цитата: sokol92 от 29 января 2022, 15:38Если сейчас запускать тест из этого сообщения, то у меня время около минуты.

Исправлено. Заодно добавил юнит-тест.
С уважением,
Михаил Каганский

sokol92

Супер! Без нормального Replace жить тяжело. Format еще можно как-то объехать. :)

Кстати, кузина SUBSTITUTE остается в бедственном положении (если только они не разделяют общий код). А эта функция в формулах Calc встречается очень часто. Написать баг?
Владимир.

mikekaganski

С уважением,
Михаил Каганский