MatLab classes overhead
Oct. 4th, 2011 04:56 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Пытаемся причесать немного нашу программу на MatLab’е, группируем написанные разными людьми скрипты в классы.
И вдруг замечаю, что функция, оформленная в виде метода, исполняется в разы медленнее... Один и тот же код (copy-paste), только данные не в глобальных переменных, а члены класса.
Позвонил в support, они мне говорят, что это не баг, это фича: доступ к переменным объекта занимает слегка больше времени, чем доступ к простым переменным. Пообещали передать разработчикам, но, судя по внутренней базе, разработчики не считают это поведение анормальным.
Оказалось, MatLab не помнит результатов проверок, которые он проводил только что. Например, в методе класса есть цикл, в цикле мы обращаемся к переменной класса (мой случай — к статической константе!). Так вот, он на каждой итерации будет проверять, существует ли такая переменная, не переопределена ли она дочерними классами, и какой у неё уровень доступа.
Написал «патч»: в начале каждого метода считываю константы в локальные переменные.
Одна из функций разогналась с 42 секунд до полутора.
Послал предложение усовершенствования в MathWorks, может премию вышлют :-)
И вдруг замечаю, что функция, оформленная в виде метода, исполняется в разы медленнее... Один и тот же код (copy-paste), только данные не в глобальных переменных, а члены класса.
Позвонил в support, они мне говорят, что это не баг, это фича: доступ к переменным объекта занимает слегка больше времени, чем доступ к простым переменным. Пообещали передать разработчикам, но, судя по внутренней базе, разработчики не считают это поведение анормальным.
Оказалось, MatLab не помнит результатов проверок, которые он проводил только что. Например, в методе класса есть цикл, в цикле мы обращаемся к переменной класса (мой случай — к статической константе!). Так вот, он на каждой итерации будет проверять, существует ли такая переменная, не переопределена ли она дочерними классами, и какой у неё уровень доступа.
Написал «патч»: в начале каждого метода считываю константы в локальные переменные.
Одна из функций разогналась с 42 секунд до полутора.
Послал предложение усовершенствования в MathWorks, может премию вышлют :-)
no subject
Date: 2011-10-04 03:14 pm (UTC)Мою прошлую пороблему вылечили исключением соответствующего куска из следующих версий =)
no subject
Date: 2011-10-04 07:43 pm (UTC)no subject
Date: 2011-10-04 07:45 pm (UTC)no subject
Date: 2011-10-04 07:47 pm (UTC)А что у тебя за фича была?
no subject
Date: 2011-10-04 09:24 pm (UTC)no subject
Date: 2011-10-05 07:19 am (UTC)С тех пор я прикрутил в MatLab собственный сервер через c++ sockets - могу исходники подкинуть :-Р
no subject
Date: 2011-10-05 04:42 pm (UTC)И неактуально уже..
no subject
Date: 2011-10-04 04:03 pm (UTC)no subject
Date: 2011-10-04 07:45 pm (UTC)no subject
Date: 2011-10-04 08:11 pm (UTC)no subject
Date: 2011-10-04 08:15 pm (UTC)константа-то небось еще и final была? :)
no subject
Date: 2011-10-04 08:19 pm (UTC)no subject
Date: 2011-10-04 05:01 pm (UTC)no subject
Date: 2011-10-04 07:47 pm (UTC)no subject
Date: 2011-10-04 08:18 pm (UTC)