Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Эксперимент с производительностью - проверьте / 11 сообщений из 11, страница 1 из 1
18.04.2009, 22:00
    #35940527
Rus000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эксперимент с производительностью - проверьте
Обнаружил тут то ли баг то ли фичу - прошу подтвердить воспроизводится ли на ваших системах. Возможно придется оптимизировать код

Описание на английском - делалось для WRC


Try out the two method implementation below. The time elapsed is hardly dependent on use of
concatenation method

The classes are:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
Class User.A Extends (%Persistent, %Populate)
{

Property SimpleProp 
As %String;

Property Reference As User.B;

ClassMethod Concat(maxrows, method) As %String
{
 set t0=$ZH
 set rs=##class(%ResultSet).%New("User.A.Extent")
 do rs.Execute()
 set str=""
 For i= 1 : 1 :maxrows {
	 quit:'rs.Next()
	 set obj=##class(User.A).%OpenId(rs.GetData( 1 ))
	 
	 if method= 2  {
	 	set var=obj.Reference.Name
	 	set:method str=str_var
	 } else 
	 {
	 	set:method str=str_obj.Reference.Name
	 }
  }
  W !,"Method"_method_" time elapsed=",$ZH-t0,!
  quit str
}

}

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Class User.B Extends 
(%Persistent, %Populate)
{

Property Name As %String;

}

Steps to reproduce the behaviour:
1)do ##class(User.B).Populate(1000000)
2)do ##class(User.A).Populate(1000000)
3)do ##class(User.A).Concat(50000,1) ;run method 1 on 50000 objects
Method1 time elapsed=64.947529
4)do ##class(User.A).Concat(50000,2) ;run method 2 on 50000 objects
Method2 time elapsed=4.131934

We get the huge difference
in time elapsed!! Method1 over 8 time slower than Method2!

The more rows we count the more
difference in time elapsed we get.
...
Рейтинг: 0 / 0
20.04.2009, 08:09
    #35941285
Turk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эксперимент с производительностью - проверьте
Предполагаю, что при первом вызове Concat() (шаг 3) выполняется запрос "User.A.Extent" и результат кэшируется в памяти, а при втором (шаг 4) используется этот самый результат из кэша. Попробуйте поменять местами вызовы шагов 3 и 4 - увидите аналогичную картину. Либо можете после каждого Concat-а очищать кэшированные запросы, тогда время отработки обоих вызовов будет одинаковым.
...
Рейтинг: 0 / 0
20.04.2009, 09:04
    #35941346
Блок А.Н.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эксперимент с производительностью - проверьте
Кэшированные запросы очищать смысла нет, так как это кэширование результата компиляции, а не кэширование объектного кода в памяти и тем более не кэширование результата.

В данном случае происходит кэширование глобалов данных, для улучшения чистоты эксперимента либо после каждого запуска рестартовать каше, либо (что лучше), делать один пробный запуск без учета результатов, а потом уже считать время.
...
Рейтинг: 0 / 0
20.04.2009, 12:25
    #35941733
Rus000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эксперимент с производительностью - проверьте
Ребят, вы не может не поняли но тема в том, что программисты могут использовать такого рода конкатенацию (например часто приходится делать для ответа веб-сервиса) и этот неявный баг может спровоцировать колоссальное падение производительности ваших приложений - и фиг догадаешься на первый взгляд в чем дело.

Производительность падает нелинейно при увеличении количества итераций.
...
Рейтинг: 0 / 0
20.04.2009, 12:26
    #35941738
Rus000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эксперимент с производительностью - проверьте
TurkПредполагаю, что при первом вызове Concat() (шаг 3) выполняется запрос "User.A.Extent" и результат кэшируется в памяти, а при втором (шаг 4) используется этот самый результат из кэша. Попробуйте поменять местами вызовы шагов 3 и 4 - увидите аналогичную картину. Либо можете после каждого Concat-а очищать кэшированные запросы, тогда время отработки обоих вызовов будет одинаковым.

порядок не влияет - проверьте сами
...
Рейтинг: 0 / 0
20.04.2009, 17:09
    #35942512
Turk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эксперимент с производительностью - проверьте
Блок А.Н. , спасибо за поправки. Поторопился утром с ответом, не туда мысль пошла.

Rus000 , проверить код именно в вашем варианте не могу - ограничение на длину строки в Cache 5.0 не дает это сделать. Пробовал чуть измененный вариант (с периодическим сохранением 32Кб блоков во временную глобаль), в этом случае разница между методами 1 и 2 была незначительной.
Не пробовали прогонять оба метода через ^%MONLBL? Может причина кроется совсем в другом (хотя бы то же кэширование).
...
Рейтинг: 0 / 0
07.05.2009, 22:22
    #35975699
Rus000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эксперимент с производительностью - проверьте
как-то темка уползла вниз, и никому не интересна, а в это время в гугл групс народ экспериментирует

разница в времени исполнения - до 25 раз (!)
...
Рейтинг: 0 / 0
08.05.2009, 07:08
    #35975897
Блок А.Н.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эксперимент с производительностью - проверьте
У меня сервера, не поддерживает строки такого размера, а в цикле 2000 разница небольшая, процентов 25 (хотя тенденция заметна).

Версия из новых, на чем тестируете вы? Или нужно что-то включить в настройках?
Код: plaintext
1.
2.
USER>w $ZV
Cache for Windows (x86- 32 )  2008 . 2 . 1  (Build  902 ) Thu Jan  22   2009   13 : 50 : 37  EST
Вообще сама по себе поставновка конкатенации(и вообще любых операций) больших строк (nul-terminated) порочна сама по себе, даже если вы на C++ напишете это - будет тормозить.

Операцию
a=a_b можно теоретически выполнить двумя способами: либо к a добавить b, либо вычислить a_b и результат присвоить переменной a.

Видимо в одном случае оптимизация происходит, в другом нет.
Кстати, с монитором %SYS.MONLBL прогоняли тесты? Есть небольшой подозрение, что тормозит не в этом месте.
...
Рейтинг: 0 / 0
08.05.2009, 08:39
    #35975945
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эксперимент с производительностью - проверьте
Rus000как-то темка уползла вниз, и никому не интересна, а в это время в гугл групс народ экспериментирует

разница в времени исполнения - до 25 раз (!)
У меня сомнений нет и не было в наличии проблемы.

Гораздо интереснее, на каком этапе решение этого вопроса в WRC.
...
Рейтинг: 0 / 0
08.05.2009, 09:09
    #35975986
Rus000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эксперимент с производительностью - проверьте
ответ wrc:


set str = str_obj.Property

is much slower than

set var = obj.Property
set str = str_var

In the second case we do much less data movement of the increasingly long str. When we have
str=str_var we can just move the value of var to the end of the existing str (as long as it fits, which it
often will). But in the case of str=str_obj.Property we have to save the current value of str, do
the concatenation, then copy the entire concatenated string back into str.

So, it's not a bug that we able to optimize some cases. It's a feature.

We can not use the optimization when the expression on the right side of the concatenation is
something that might cause the value of str to change, because the optimization relies on being able to
use the existing str value.

Referencing an object property is not eligible because it may call a property Get method which
could change the value of str.
...
Рейтинг: 0 / 0
08.05.2009, 12:07
    #35976426
Блок А.Н.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эксперимент с производительностью - проверьте
То, что я и предположил в последнем посте, теперь понятно логика, почему IS отключает оптимизацию в случае obj.value
...
Рейтинг: 0 / 0
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Эксперимент с производительностью - проверьте / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]