2013-12-12 3 views
0

Я нашел интересную вещь. Проходящий аргумент может заслуживать рассмотрения, особенно в ситуации, когда важно время. код, как показано ниже.стоимость аргумента, проходящая в схеме

(define (collatz-num n) 
    (define (collatz-iter n m) 
    (cond 
    ((= n 1) 
     m) 
    ((even? n) 
     (collatz-iter (/ n 2) (+ m 1))) 
    (else 
     (collatz-iter (+ (* 3 n) 1) (+ m 1))))) 
    (collatz-iter n 1)) 


(define (collatz-iter n m) 
    (cond 
    ((= n 1) 
    m) 
    ((even? n) 
    (collatz-iter (/ n 2) (+ m 1))) 
    (else 
    (collatz-iter (+ (* 3 n) 1) (+ m 1))))) 

(define (euler14 n limit) 
    (define (help-iter m len n limit) 
    (let ((collatz (collatz-iter n 1))) 
     (cond 
     ((> n limit) 
     (list m len)) 
     ((> collatz len) 
     (help-iter n collatz (+ n 2) limit)) 
     (else 
     (help-iter m len (+ n 2) limit))))) 
    (help-iter 0 0 n limit)) 

для Коллатца-ITER

> (time (euler14 1 1000000)) 
cpu time: 1596 real time: 1596 gc time: 0 

для Коллатца-NUM

> (time (euler14 1 1000000)) 
cpu time: 1787 real time: 1789 gc time: 0 

Мой вопрос:

  1. Насколько велика стоимость прохождения аргумента в схеме

  2. В функции euler14, я позволяю предел в качестве аргумента справки-ITER, это будет сэкономить время этот путь? как я где-то видел, свободная переменная будет стоить.

Возможно, я слишком скупо.

+1

У вас есть вопросы? – Clive

+0

Я обновляю вопрос. – kuan291

+0

Неужели кто-нибудь ответил на ваш предыдущий вопрос о производительности для вашего удовлетворения? – GoZoner

ответ

0

Снова. это очень специфическая реализация!

Я проверил ваш код и, поскольку он потребляет память и выполняет множество вычислений, порядок, в котором я тестировал два, повлиял на второй результат. Я разделил два теста в каждом файле и запускал их каждые 40 раз отдельно и смотрел среднее время работы для обоих. Различия были num: 1059,75 и итера: 1018,85. 4% разница в среднем, но также может составлять 12% при выборе двух образцов. Я предполагаю, что время работы одной и той же программы может отличаться более чем на 4% в среднем, поэтому разница между ними не имеет значения в одном прогоне.

У вас есть дополнительное приложение в коде, чтобы проверить, насколько сильно повлиял аргумент, который я сделал для этого небольшого теста. Использование аргументов в базовом случае, так что схема не будет оптимизировать их прочь:

(define (three-params x y z) 
    (if (zero? x) 
     (cons y z) 
     (three-params (- x 1) x x))) 

(define (two-params x y) 
    (if (zero? x) 
     (cons x y) 
     (two-params (- x 1) x))) 

(define (one-param x) 
    (if (zero? x) 
     (cons x x) 
     (one-param (- x 1)))) 

(define numtimes 100000000) 
(time (one-param numtimes)) 
(time (two-params numtimes #f)) 
(time (three-params numtimes #f #f)) 

Закомментируйте 2 из трех последних строк и сделать 3 файлов. Скомпилируйте их, если сможете. Делают в среднем несколько пробегов. Я выбираю 50 и Икарус я получаю следующие средние:

 agvms diffms 
one 402.4 
two 417.82 15.42 
three 433.14 15.32 
two2 551.38 133.56 (with an extra addition compared to two) 

Просто глядя на 50 результатов, которые я вижу, что время перекрытия между один, два и три, но статистически это выглядит как средний аргумент стоит 0, 15ns. if, zero?, - и cons и gc стоят намного больше, даже если они являются примитивными. Ни дополнительные приложения, ни дополнительные аргументы не должны вас беспокоить. Иногда другая реализация оптимизирует ваш код по-разному, поэтому переход от ракетки к ikarus, гамбиту или курице может улучшить ваш код на производстве.

+0

Очень профессионально. Я думаю, что в строке «три» и «два2» запятая - это период. На практике это не имеет значения. Мне просто интересно. Я должен узнать больше о компиляторе Scheme. – kuan291

+0

Является ли ikarus еще в разработке? Я нашел его последнюю дату 2008 – kuan291

+0

@ kuan291 Исправлено. Создатель, Абдулазиз Гулум, ничего не сделал с 2010 года, поэтому вы правы в отношении остановки разработки, но 0.0.4, вероятно, лучше 0.0.3, даже если он официально не выпускается (это то, что отправляет Ubuntu). Остается посмотреть, поддержит ли Ikarus текущий стандарт R7RS, но это тот же вопрос, который у меня есть для других реализаций. – Sylwester

Смежные вопросы