Render.ru

Нужна помошь знатоков по векторным операциям

Andots

Знаток
Рейтинг
66
ммм. "ступор конвеера происходит из-за неверного предсказания перехода" т.е как я понял, если к примеру я предполагаю что моем меше будет гораздо больше вершин с нулевым весом то мне
вместо "if W!=0" лучше написать if w=0 {}; else {formula};
Хотя в данном контексте это наверное одно и тоже, в общем если я верно понял то первое условие должно быть наиболее вероятное, дабы избежать проверки второго.
 

4i4ikov

Знаток
Рейтинг
37
ммм. "ступор конвеера происходит из-за неверного предсказания перехода" т.е как я понял, если к примеру я предполагаю что моем меше будет гораздо больше вершин с нулевым весом то мне
вместо "if W!=0" лучше написать if w=0 {}; else {formula};
Хотя в данном контексте это наверное одно и тоже, в общем если я верно понял то первое условие должно быть наиболее вероятное, дабы избежать проверки второго.
Компилятор по своему все ифы переделает. да ещё в зависимости от ключей оптимизации.
Достаточно if (w>eps) formula;
Да ничего там страшного, чтоб на этом так зацикливаться, ступор это не "ааа! ступор!!! всё пропало!!!", а так штатный плановый ступоришко))
 

Andots

Знаток
Рейтинг
66
Да ничего там страшного, чтоб на этом так зацикливаться, ступор это не "ааа! ступор!!! всё пропало!!!", а так штатный плановый ступоришко))
Не, ты был прав. Причем оптимизация это не беда и не корень бед. Это болезнь. Я вот сейчас вместо того чтоб писать деформер , думаю как оптимизировать алгоритм. Прекрасно понимаю как это все сделать стандартными средствами, но осознавая что это абсолютно не оптимально сижу и парю себе мозги возможностями оптимизации . Абсолютная глупость.
 

4i4ikov

Знаток
Рейтинг
37
Про МЕЛ забыли)))
Внезапно вспомнил что у мела есть тип vector, встроенный родной и все векторные операции в придачу. Грех не померить было, оказалось мелок не хило так попячивает питошу - в 5 раз! наоборот медленнее в 2 раза, была ошибка в замерах

Замерялка на МЕЛ (аналог второй оптимизированой):
Код:
proc vector vectorTest_Dark(vector $v1, vector $v2,vector $v3){
    vector $v21 = $v2-$v1;
    return $v1+dot(($v3-$v1),$v21)*$v21/dot($v21,$v21);
    }

proc vector vectorTest_4i4ikov(vector $v1, vector $v2,vector $v3){
    vector $v21 = $v2-$v1;
    vector $v13 = $v1-$v3;
    vector $v23 = $v2-$v3;
    float $k = (($v13*$v13)-($v23*$v23))/(2*$v21*$v21) + 0.5;
    return $v2*$k+$v1*(1-$k);
    }

print("/* Maya "+`about -v`+" x"+(`about -x64`?"64":"32")+"\n");
print("--------------- "+"Check\n");
vector $v1 = <<5.111 , -2.046, -1.956>>;
vector $v2 = <<-5.419 , -0.070 , -1.225>>;
vector $v3 = << -0.246 , 0 , -6.764>>;
print(vectorTest_Dark($v1,$v2,$v3)+"\n");
print(vectorTest_4i4ikov($v1,$v2,$v3)+"\n");
print("delta check: "+(vectorTest_Dark($v1,$v2,$v3)-vectorTest_4i4ikov($v1,$v2,$v3)+"\n"));

int $N = 1000000;
print("--------------- "+"Bench <MEL> "+$N+"\n");
$M = $N/100000; if ($M!=1) print("bench time magnitude correction: "+$M+"\n");
for ($n=0; $n<4; $n++){
    $startTime = `timerX`;
    for ($i=1; $i<$N; $i++) vectorTest_Dark($v1/$i,$v2/$i,$v3/$i);
    $bench = `timerX -startTime $startTime`;
    print ("Dark    "+$bench*10/$M+"\n");

    $startTime = `timerX`;
    for ($i=1; $i<$N; $i++) vectorTest_4i4ikov($v1/$i,$v2/$i,$v3/$i);
    $bench = `timerX -startTime $startTime`;
    print ("4i4ikov       "+$bench*10/$M+"\n");
}print "*/\n";
результат:
Код:
/* Maya 2013 x32
--------------- Check
-0.08803121906 -1.070379327 -1.595079599
-0.08803121906 -1.070379327 -1.595079599
delta check: 1.33226763e-015 -2.220446049e-016 -2.220446049e-016
--------------- Bench <MEL> 1000000
bench time magnitude correction: 10
Dark    0.4
4i4ikov       0.61
Dark    0.42
4i4ikov       0.59
Dark    0.4
4i4ikov       0.59
Dark    0.41
4i4ikov       0.59
*/
timerX - выдает время в десятых секунды! из-за этого сперва была ошибка.
И для точности пришлось число замеров увеличить в 10, а потом время делить на 10 чтобы сравнить можно было. (bench time magnitude correction)

а на питоне
Код:
-------------------- check
Dark    (vector): (-0.0880312, -1.07038, -1.59508)
4i4ikov (scalar): (-0.0880312, -1.07038, -1.59508)
delta check: (1.33227e-015, -2.22045e-016, -2.22045e-016)
-------------------- bench <2> 100000
Dark    (vector): 0.219000101089
4i4ikov (scalar): 0.311999797821
Dark    (vector): 0.219000101089
4i4ikov (scalar): 0.31299996376
delta check - это разница результата между формулами
питону добавить:
print 'delta check:',vectorTest_Dark(v1,v2,v3)-vectorTest_4i4ikov(v1,v2,v3)

delta check у них одинаковое, потому что точность и там и там float.

Так что мел вполне может ускорить критичные вычисления в сравнение с питоном.
Всё не так - мел сасает, питоха рулит!
 
Последнее редактирование:

Andots

Знаток
Рейтинг
66
Про МЕЛ забыли)))
Внезапно вспомнил что у мела есть тип vector, встроенный родной и все векторные операции в придачу. Грех не померить было, оказалось мелок не хило так попячивает питошу - в 5 раз!
Попробуй ради интереса, ели не лень, запустить на внешнем питоне 2.7 Если скорость будет такая же то значит сам по себе питошка тормознутый, если нет, то майский питон просто глупо прикручен.

Ну а то сути для скриптов не сколько скорость важна сколько возможности и удобство. Как по мне , так на питоне удобней и фиг с тем что мел быстрее, не принципиально.Ну а ноды и деформеры в любом случае на плюсах лучше писать чем на питоне.
 

4i4ikov

Знаток
Рейтинг
37
Не то и не то, все питноновские тесты были для maya.api.OpenMaya
У пимела есть Vector, но это оберка майского апи, если тестить, то только чтобы посмотреть насколько пимел медленнее.

cmds тестить тоже смысла особого нет, это враппер мела, тоже медленнее.
 

Andots

Знаток
Рейтинг
66
Я вообще не удивлюсь если майские програмеры дабы не парить особо мозг написали питонские модули не через АПи а просто перевели питонские команды в мел.
 

4i4ikov

Знаток
Рейтинг
37
Попробуй ради интереса, ели не лень, запустить на внешнем питоне 2.7 Если скорость будет такая же то значит сам по себе питошка тормознутый, если нет, то майский питон просто глупо прикручен.
Да, интересно сравнить мел с чистым питоном (без апи).
Могу просто шаблоны для тестирования сделать из того что уже накидано в топике.
Можно будет потестить на какой нибудь элементарщине типа 2+2*2, этого достаточно будет.
Мне интереснее перевести вектора в элементарные операции и так сравнить, чтобы на том же результате проверять, потом время будет - посмотрю.

Затем сравнить именно майский питон и внешний, вряд ли там большая разница будет, в майе стандартный питон, но интересно конечно.

Ну а то сути для скриптов не сколько скорость важна сколько возможности и удобство. Как по мне , так на питоне удобней и фиг с тем что мел быстрее, не принципиально.Ну а ноды и деформеры в любом случае на плюсах лучше писать чем на питоне.
Вот в этом то и вся суть, разработка на питоне намного быстрее, причем охренительно быстрее, потому что более гибкий язык, нет строгой типизации, нормальная отбивка ошибок, ООП! - ООП вообще сильно ускоряет писанину и снижает сложность больших проектов.
Сравнивал для интереса скорость разработки на меле и питоне на одной и той же задаче, разница реально охренительная, и чем больше прект, тем питон эффективнее.

Переход на cpp будет в ущерб скорости разработки. Так что тут выбор между скорость работы и скорость разработки и второе в целом оказывается важнее.

Базово можно начинать проект на питон, потом по необходимости думать уже про cpp, или даже про mel, в общем так сейчас и происходит.
 

4i4ikov

Знаток
Рейтинг
37
Я вообще не удивлюсь если майские програмеры дабы не парить особо мозг написали питонские модули не через АПи а просто перевели питонские команды в мел.
Стандартный питон взят, он же опенсорц. Покрамсали только, самое нужное отрезали))
 

Andots

Знаток
Рейтинг
66
Стандартный питон взят, он же опенсорц. Покрамсали только, самое нужное отрезали))
Не не , я другое имею ввиду. В с++ майском апи есть оператор вызова мел команды, я потому и думаю что дабы не тратить время на прописывание на maya c++ api, что раз в 10 дольше, просто сделали так что вызов из питона просто вызывает меловскую команду. По сему и снижение производительности. Хотя это сложно прикрутить к арифметике (хотя в векторах вполне возможно), но кто его знает что там наворотили, не удивлюсь если все через заднее место. Этожж Автостол :)
Переход на cpp будет в ущерб скорости разработки. Так что тут выбор между скорость работы и скорость разработки и второе в целом оказывается важнее.
.
Ну все таки не стоит рассматривать плюсы как скриптовый язык, понятно что можно запихивать плюсы командным плагином, но это из пушки по воробьям. А в нодах и деформерах важна не скорость разработки а скорость выполнения, Вот могу сколько угодно спорить поскольку делал это и там и там. Написание ноды и плагина на Python API и на C++ APi, мало чем отличается друг от друга по сложности и писанине. Совсем чутка на питоне проще и быстрее.
 
Последнее редактирование:

Lemieux

Знаток
Рейтинг
58
Не не , я другое имею ввиду. В с++ майском апи есть оператор вызова мел команды, я потому и думаю что дабы не тратить время на прописывание на maya c++ api, что раз в 10 дольше, просто сделали так что вызов из питона просто вызывает меловскую команду. По сему и снижение производительности. Хотя это сложно прикрутить к арифметике (хотя в векторах вполне возможно), но кто его знает что там наворотили, не удивлюсь если все через заднее место. Этожж Автостол
Так ты вскрой модуль datatypes и посмотри описание класса Vector :)
 

4i4ikov

Знаток
Рейтинг
37
Не не , я другое имею ввиду. В с++ майском апи есть оператор вызова мел команды, я потому и думаю что дабы не тратить время на прописывание на maya c++ api, что раз в 10 дольше, просто сделали так что вызов из питона просто вызывает меловскую команду. По сему и снижение производительности. Хотя это сложно прикрутить к арифметике (хотя в векторах вполне возможно), но кто его знает что там наворотили, не удивлюсь если все через заднее место. Этожж Автостол :)
Если мел вызывется из апи, то мел и исполняется. Если api из питона, то вызовы транслируются в библиотечные dll

Ну все таки не стоит рассматривать плюсы как скриптовый язык, понятно что можно запихивать плюсы командным плагином, но это из пушки по воробьям. А в нодах и деформерах важна не скорость разработки а скорость выполнения, Вот могу сколько угодно спорить поскольку делал это и там и там. Написание ноды и плагина на Python API и на C++ APi, мало чем отличается друг от друга по сложности и писанине. Совсем чутка на питоне проще и быстрее.
На самом деле надо разделять - скриптинг и плагины, я говорил чисто о скриптах. Плагины на питоне это как перевод с родного языка cpp на не родной питонячий, конечно плюг оптимальнее писать на родном языке.
 

Andots

Знаток
Рейтинг
66
Если мел вызывется из апи, то мел и исполняется. Если api из питона, то вызовы транслируются в библиотечные dll


На самом деле надо разделять - скриптинг и плагины, я говорил чисто о скриптах. Плагины на питоне это как перевод с родного языка cpp на не родной питонячий, конечно плюг оптимальнее писать на родном языке.
Не, я немного не то имел ввиду. Любая майская команда на питоне это по сути командный плаг на с++.
Тут 2 варианта действий.
1й: Переписать ее на API
2й: Просто вызвать меловскую команду и соответсвенно исполнить обычную мел команду (что гораздо проще) Вот как раз тут и может быть уменьшение производительности. Поскольку время тратится на вызов команды.

На самом деле надо разделять - скриптинг и плагины, я говорил чисто о скриптах.
Ну понятно, как я и сказал ранее с++ в скриптах это из пушки по воробьям. Там уж совершенно не нужна производительность, по большому счету наплевать что твой скрипт на с++ выполнит действие за 0.00001 сек, а на питошке за уЖастных 0.002 сек ( со старости сдохнуть можно :) ). Тут уж что проще, а в данном варианте питон в 10000000 раз проще и быстрее в написании.
 

4i4ikov

Знаток
Рейтинг
37
Не, я немного не то имел ввиду. Любая майская команда на питоне это по сути командный плаг на с++.

Тут 2 варианта действий.

1й: Переписать ее на API

2й: Просто вызвать меловскую команду и соответсвенно исполнить обычную мел команду (что гораздо проще) Вот как раз тут и может быть уменьшение производительности. Поскольку время тратится на вызов команды.
Просто и вызывается мел, я и говорю что когда вызывается мел, то мел и исполняется. Но в топике мы это не тестим, мы же апишные вектора смотрели, там нет мела из питона.

Ну понятно, как я и сказал ранее с++ в скриптах это из пушки по воробьям. Там уж совершенно не нужна производительность, по большому счету наплевать что твой скрипт на с++ выполнит действие за 0.00001 сек, а на питошке за уЖастных 0.002 сек ( со старости сдохнуть можно ). Тут уж что проще, а в данном варианте питон в 10000000 раз проще и быстрее в написании.
Если милион полигонов, то питонское время уже десятками минут может измеряться, практически сетки с сотней полигонов вполне комфортно и питоном смолоть.
 

Andots

Знаток
Рейтинг
66
Ты знаешь, лично для себя я готов подождать эти 10 минут. Если это скрипт. Я на ++апи пару дней 0 на выходе отлавливал. Нет ни возможности дебага, по сути ничего нет. Пишешь , компилешь, чешешь репу. Оказалось что забрал данные немножко не верно. mpoint -- mvector бла бла бла итп. Минимум инфы, на русском вообще ее нет, да даже на инглише практически не найти. Складывается ощущение что на плюсах на майку пишет по всему земному шарику 10-15 человек, из которых готовы делиться чем то 2-3 чела. С питошей гораздо все радостней.
 

4i4ikov

Знаток
Рейтинг
37
Ты знаешь, лично для себя я готов подождать эти 10 минут.
Лично ты и я можем конечно подождать, а заказчик не может)) Скрипты "иногда" в продакшене используются и каждый день, и по несколько раз в день.
 

Andots

Знаток
Рейтинг
66
Лично ты и я можем конечно подождать, а заказчик не может)) Скрипты "иногда" в продакшене используются и каждый день, и по несколько раз в день.
Так то да. Но все познается в сравнении. Я не думаю что твой заказчик владеет какими-то цифрами для сравнивая производительности. Так что тут говорить не о чем, для заказчика важен результат и время получения этого результата, ну уж никак не локальная скорость данного скрипта или плага.
Тут уж лучще промолчать, иначе твой заказчик скажет " А шоо, а шоо такое cpp усе говорят что они быстрее" ... :)
 

4i4ikov

Знаток
Рейтинг
37
Так то да. Но все познается в сравнении. Я не думаю что твой заказчик владеет какими-то цифрами для сравнивая производительности. Так что тут говорить не о чем, для заказчика важен результат и время получения этого результата, ну уж никак не локальная скорость данного скрипта или плага.
Тут уж лучще промолчать, иначе твой заказчик скажет " А шоо, а шоо такое cpp усе говорят что они быстрее" ... :)
Так время получения этого результата напрямую свазяны с локальной скорость данного скрипта)
И заказчик вообще может не знать о скрипте, это внутренняя организация твоей работы, можно потратить 5 часов на работу, а можно и 15. Так что в первую очередь это нужно тебе, а заказчику нужнен только результат.

--------
Сейчас померил скорости всяких питонов и мелов на простой формуле i+i*i - просто бузумие какое-то, результаты совершенно неожиданные. Также сравнил с разными типами float и int - тут ещё интересней, у майского питона огромная просадка при переходе на int (может и ошибка у меня)
А PyPy вообще с космической скоростью молотит.
В общем мерьте сами, не лишайте себя удовольствия)))
 

4i4ikov

Знаток
Рейтинг
37
Ошибку нашёл в меловских замерах, timerX выдает время а десятых секунды, а я замер сделал в секундах.
Значит мел не в 5 раз быстрее, а в 2 раза медленнее.
Так что можно не рыпаться обратно на мел)))
А я то думаю, почему по ощущениям вроде долго, а по цифрам быстро)))
 
Сверху