|
![]() |
#1 |
Участник
|
Попробовал через System.Numerics.BigInteger
Если без преобразования результата к аксаптовскому типу str, то летает как и у Андре - не успеешь моргнуть. Для 10000 элементов. Но! Если выводить в инфолог, то надо присваивать переменной типа str. И вот тут-то для 10000 элементов Аксапта работает несколько минут. |
|
|
За это сообщение автора поблагодарили: mazzy (2). |
![]() |
#2 |
Участник
|
Вот такой джоб.
Если закомметировать две этих строки, то отрабатывает моментально. Но если надо вывести в инфолог, то работает несколько минут для 10000 элементов. X++: s = t.ToString();
info(strFmt("%1: %2", i, s)); X++: static void Job121(Args _args) { int fibonacciSize = 10000; int i; System.Numerics.BigInteger x; System.Numerics.BigInteger y; System.Numerics.BigInteger t; str s; ; x = new System.Numerics.BigInteger(0); y = new System.Numerics.BigInteger(1); s = x.ToString(); info(strFmt("1: %1", s)); s = y.ToString(); info(strFmt("2: %1", s)); for (i = 3; i <= fibonacciSize; i++) { t = System.Numerics.BigInteger::Add(x, y); s = t.ToString(); info(strFmt("%1: %2", i, s)); x = y; y = t; } } |
|
![]() |
#3 |
Участник
|
|
|
![]() |
#4 |
Участник
|
Мой вывод такой. System.Numerics.BigInteger эффективно использовать для большого количества внутренних расчетов. Но присвоение этой переменной к аксаптовскому типу str очень медленное для больших чисел. Похоже, что оно медленне, чем мой код на X++, который запихивает большие числа в массив из 1000 чисел типа int64.
|
|
![]() |
#5 |
Участник
|
Цитата:
Сообщение от Ace of Database
![]() Мой вывод такой. System.Numerics.BigInteger эффективно использовать для большого количества внутренних расчетов. Но присвоение этой переменной к аксаптовскому типу str очень медленное для больших чисел. Похоже, что оно медленне, чем мой код на X++, который запихивает большие числа в массив из 1000 чисел типа int64.
мне кажется, что здесь плохо работает сборщик мусора. опять же, на 2012 стоит попробовать на клиенте и на сервере. со включенным CIL и с выключенным. |
|
![]() |
#6 |
Участник
|
Отредактировал Job120, Теперь он показывает порядковый номер числа Фибоначчи. И выводит ровно столько элементов ряда, сколько было заказано. Раньше выводил на 2 элемента больше - не считал первые два 0 и 1.
|
|
|
За это сообщение автора поблагодарили: mazzy (2), Raven Melancholic (5). |
![]() |
#7 |
Участник
|
Вот результаты сравнения работы двух джобов для получения 10 тысяч элементов Фибоначчи..
Job120, который не использует System.Numerics.BigInteger, с выводом в инфолог работает 57 секунд. Job121, который использует System.Numerics.BigInteger, с выводом в инфолог работает 2 минуты 08 секунд. Job120, который не использует System.Numerics.BigInteger, без вывода в инфолог работает 18 секунд. Job121, который использует System.Numerics.BigInteger, без вывода в инфолог работает моментально |
|
|
За это сообщение автора поблагодарили: Pustik (12). |
![]() |
#8 |
Участник
|
зачем? у бигинта есть toString )))
============== эх, остановили мой серверок с акс6. пришлось на акс7 делать... так и не понял как сейчас там свой таймер запускать. но результаты такие: время выполнения с выводом в инфолог одного последнего числа = 317 ms последнее рассчитанное число: 54438373113565281338734260993750380135389184554695967026247715841208582865622349017083051547938960541173822675978026317384359584751116241439174702642959169925586334117906063048089793531476108466259072759367899150677960088306597966641965824937721800381441158841042480997984696487375337180028163763317781927941101369262750979509800713596718023814710669912644214775254478587674568963808002962265133111359929762726679441400101575800043510777465935805362502461707918059226414679005690752321895868142367849593880756423483754386342639635970733756260098962462668746112041739819404875062443709868654315626847186195620146126642232711815040367018825205314845875817193533529827837800351902529239517836689467661917953884712441028463935449484614450778762529520961887597272889220768537396475869543159172434537193611263743926337313005896167248051737986306368115003088396749587102619524631352447499505204198305187168321623283859794627245919771454628218399695789223798912199431775469705216131081096559950638297261253848242007897109054754028438149611930465061866170122983288964352733750792786069444761853525144421077928045979904561298129423809156055033032338919609162236698759922782923191896688017718575555520994653320128446502371153715141749290913104897203455577507196645425232862022019506091483585223882711016708433051169942115775151255510251655931888164048344129557038825477521111577395780115868397072602565614824956460538700280331311861485399805397031555727529693399586079850381581446276433858828529535803424850845426446471681531001533180479567436396815653326152509571127480411928196022148849148284389124178520174507305538928717857923509417743383331506898239354421988805429332440371194867215543576548565499134519271098919802665184564927827827212957649240235507595558205647569365394873317659000206373126570643509709482649710038733517477713403319028105575667931789470024118803094604034362953471997461392274791549730356412633074230824051999996101549784667340458326852960388301120765629245998136251652347093963049734046445106365304163630823669242257761468288461791843224793434406079917883360676846711185597501 X++: using System.Numerics; class fibb { /// <summary> /// Runs the class with the specified arguments. /// </summary> /// <param name = "_args">The specified arguments.</param> public static void main(Args _args) { int fibonacciSize = 10000; int i; BigInteger x = 0; BigInteger y = 1; BigInteger z; for(i=0; i<fibonacciSize; ++i) { z = BigInteger::Add(x,y); //info(z.ToString()); x = y; y = z; } info(strFmt("last num: %1", z.ToString())); } } спасибо! очень увлекательно. и удалось узнать что-то новое. |
|
|
За это сообщение автора поблагодарили: Ace of Database (10). |
![]() |
#9 |
Участник
|
так я же и использовал toString.
Но присваивал его переменной с типом str, так как напрямую передавать в функцию strfmt не получается - вываливается в отладчик с ошибкой о неудачном преобразовании типов. AX2012 R2 Последний раз редактировалось mazzy; 12.02.2017 в 01:43. |
|
|
За это сообщение автора поблагодарили: mazzy (2). |
![]() |
#10 |
Участник
|
Напрямую не удается вызвать BigInt.ToString() в функцию strfmt.
Приходится сначала его присваивать переменной типа str,. |
|
![]() |
#11 |
Участник
|
А ещё бы я обратил внимание на стиль кода:
X++: using System.Numerics; class fibb { /// <summary> /// Runs the class with the specified arguments. /// </summary> /// <param name = "_args">The specified arguments.</param> public static void main(Args _args) { int fibonacciSize = 10000; int i; BigInteger x = 0; BigInteger y = 1; BigInteger z; for(i=0; i<fibonacciSize; ++i) { z = BigInteger::Add(x,y); //info(z.ToString()); x = y; y = z; } info(strFmt("last num: %1", z.ToString())); } } X++: for(i=0; i<fibonacciSize; ++i) X++: ++i |
|
|
За это сообщение автора поблагодарили: mazzy (2). |
![]() |
#12 |
Участник
|
Цитата:
Кстати, программирование без пробелов распространено в 1С, в самой популярной системе среди программистов. Может быть Маззи пытается таким образом повыстить популярность Аксапты. Может быть, в программирование без пробелов он вкладывает более глубокий смысл. А может быть, это просто гениальное чутье. |
|
![]() |
#13 |
Участник
|
в акс7 и в c# пробелы расставляются по-разному.
причем внутри МС очень жестокий контроль несоответствия бест-практису - несоответствующее просто не билдится. поначалу было непривычно. потом перепривык. теперь расставляю хаотически и смотрю ошибки компиляции от бест-практиса ))) префиксный ++ остался еще с C, где способ записи имел значение. оба способа могут выстрелить в колено. но префиксный был быстрее в общем случае. интересная статья и комментарии про задачи на собеседованиях http://alenacpp.blogspot.co.uk/2005/...ce-points.html AP-1055D подметил совершенно точно - стиль, который выдает... ))) и таки да, я очень любил на собеседованиях задавать вопрос "что не нравится?" ответ на этот вопрос лучше всего показывает с чем человек работал. в частности, AP-1055D не понравился стиль. ок. почему бы и нет? но сразу понятно что человек очень долго работал с продуктом, где применяется только такой стиль, чтобы считать такой стиль каноном )))) Последний раз редактировалось mazzy; 15.02.2017 в 10:44. |
|
|
За это сообщение автора поблагодарили: Ace of Database (3). |
![]() |
#14 |
Moderator
|
Цитата:
Поэтому конструкция a=*(--ptr) и a=*(ptr++) транслировались в одну машинную команду, а конструкции a=*(ptr--) и a=*(++ptr) - в две. Аналогично - операции ++ и -- были введены как раз потому что в PDP-11 были специальные машинные команды INC и DEC, которые увеличивали или уменьшали операнд на единицу и работали занимали меньше памяти и работали чуть быстрее чем обычные операции сложения и вычитания. |
|
![]() |
#15 |
Участник
|
Цитата:
Сообщение от mazzy
![]() последнее рассчитанное число:
54438373113565281338734260993750380135389184554695967026247715841208582865622349017083051547938960541173822675978026317384359584751116241439174702642959169925586334117906063048089793531476108466259072759367899150677960088306597966641965824937721800381441158841042480997984696487375337180028163763317781927941101369262750979509800713596718023814710669912644214775254478587674568963808002962265133111359929762726679441400101575800043510777465935805362502461707918059226414679005690752321895868142367849593880756423483754386342639635970733756260098962462668746112041739819404875062443709868654315626847186195620146126642232711815040367018825205314845875817193533529827837800351902529239517836689467661917953884712441028463935449484614450778762529520961887597272889220768537396475869543159172434537193611263743926337313005896167248051737986306368115003088396749587102619524631352447499505204198305187168321623283859794627245919771454628218399695789223798912199431775469705216131081096559950638297261253848242007897109054754028438149611930465061866170122983288964352733750792786069444761853525144421077928045979904561298129423809156055033032338919609162236698759922782923191896688017718575555520994653320128446502371153715141749290913104897203455577507196645425232862022019506091483585223882711016708433051169942115775151255510251655931888164048344129557038825477521111577395780115868397072602565614824956460538700280331311861485399805397031555727529693399586079850381581446276433858828529535803424850845426446471681531001533180479567436396815653326152509571127480411928196022148849148284389124178520174507305538928717857923509417743383331506898239354421988805429332440371194867215543576548565499134519271098919802665184564927827827212957649240235507595558205647569365394873317659000206373126570643509709482649710038733517477713403319028105575667931789470024118803094604034362953471997461392274791549730356412633074230824051999996101549784667340458326852960388301120765629245998136251652347093963049734046445106365304163630823669242257761468288461791843224793434406079917883360676846711185597501 |
|
![]() |
#16 |
Участник
|
На примере Ace of Database как раз видно, чем полезны подобные вопросы на собеседовании (включая "Как передвинуть гору фудзи?").
Предложено решение, самостоятельно признаны его ограничения недостатки, предложены варианты, при поиске решений продемонстрировано не только умение разработать алгоритм, но и способность найти что-то в смежных областях (тот же BigInteger). PS: кстати, как раз на числа Фибоначчи пришлось пару лет назад смотреть при решении совершенно определенной бизнес задачи оптимизации объема закупок по результатам сводного планирования, правда выбрал другой способ, но зарекаться ,что "это никогда не понадобится при решении стоящих перед нами задач" я бы не стал. Последний раз редактировалось Raven Melancholic; 13.02.2017 в 11:43. |
|
|
За это сообщение автора поблагодарили: mazzy (2), AlexeyS (1). |
![]() |
#17 |
Участник
|
Вот так и возвращаются советы назад.
Про Кнута именно mazzy упомянул в этой теме. Помню дали задачку, вывести ряд Фибоначи. Нарисовал рекурсию. Не понравилось. Видать не поняли. |
|
|
За это сообщение автора поблагодарили: mazzy (2). |
![]() |
#18 |
Участник
|
|
|
|
За это сообщение автора поблагодарили: Diman (1). |
![]() |
#19 |
Участник
|
)))))))))
да, и использование машинной инструкции привело к огромным последствиям впоследствии. даже не столько из-за отсутствия инструкций на некоторых процессорах. сколько из-за логических проблем с сущностью, которую впоследствии назвали "точки следования" |
|
![]() |
#20 |
Участник
|
А в Qlik Sense с помощью кода:
X++: Let n = 50; For v = 0 to n If v = 0 then Let f = 0; ElseIf v = 1 then Let f = 1; Else Let f = f_2 + f_1; End If; Fibonacci: Load * Inline [ N, F $(v), $(f) ]; Let f_2 = f_1; Let f_1 = f; Next А чтобы вычислить n-значение можно использовать матричную алгебру: X++: Let f00 = 1; Let f01 = 0; Let f10 = 0; Let f11 = 1; Let m00 = 1; Let m01 = 1; Let m10 = 1; Let m11 = 0; Let v = n; Do while v > 0 If Mod(v, 2) = 1 then Let a = f00 * m00 + f01 * m10; Let b = f00 * m01 + f01 * m11; Let c = f10 * m00 + f11 * m01; Let d = f10 * m01 + f11 * m11; Let f00 = a; Let f01 = b; Let f10 = c; Let f11 = d; End If Let v = Div(v, 2); Let a = m00 * m00 + m01 * m10; Let b = m00 * m01 + m01 * m11; Let c = m10 * m00 + m11 * m01; Let d = m10 * m01 + m11 * m11; Let m00 = a; Let m01 = b; Let m10 = c; Let m11 = d; Loop Fibonacci: Load * Inline [ N, F $(v), $(f10) ]; Последний раз редактировалось AP-1055D; 16.02.2017 в 16:00. |
|