Re[43]: Write in Brainfuck!
От: Cyberax Марс  
Дата: 24.12.06 16:45
Оценка:
Turtle.BAZON.Group wrote:
> Сравнение hard real-time линуксов и как их сделать (системой патчей)
[skip]
> То же самое можно сделать и для виндов, и здесь
> <http://www.windowsfordevices.com/articles/AT2503923807.html&gt; и здесь
> <http://www.omac.org/OMACTemplate.cfm?Section=Documents69&amp;template=/ContentManagement/ContentDisplay.cfm&amp;ContentID=48656&gt;
> это рассказываается.
Пока это либо очень грубый realtime (гарантия ответа в миллисекундных
диапазонах) или работает "параллельно" с основной системой (как в случае
с Win XP). То есть real-time части могут в любой момент "отодвинуть"
основную систему и заняться своим делом.

А в QNX само по себе микроядро гарантировано real-time (и может быть
переписано без циклов). Там гарантии в микросекундных диапазонах. В
vxWorks — аналогично.
Posted via RSDN NNTP Server 2.1 beta
Sapienti sat!
Re[44]: Write in Brainfuck!
От: Turtle.BAZON.Group  
Дата: 25.12.06 09:17
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>А в QNX само по себе микроядро гарантировано real-time (и может быть

C>переписано без циклов). Там гарантии в микросекундных диапазонах. В
C>vxWorks — аналогично.

Так как я понял, микроядра для Linux и Windows тоже меняются для обеспечения hard real-time.
... << RSDN@Home 1.2.0 alpha rev. 669>>
Re[45]: Write in Brainfuck!
От: Cyberax Марс  
Дата: 25.12.06 12:36
Оценка: +1
Turtle.BAZON.Group wrote:
> C>А в QNX само по себе микроядро гарантировано real-time (и может быть
> C>переписано без циклов). Там гарантии в микросекундных диапазонах. В
> C>vxWorks — аналогично.
> Так как я понял, микроядра для Linux и Windows тоже меняются для
> обеспечения hard real-time.
Нет, QNX — это микроядерная ОС. Там все микроядро около 20Кб кода.

Windows/Linux — это монолитные ОС. Для реал-тайма там просто при
необходимости само ядро вытесняется специальным real-time ядром.
Posted via RSDN NNTP Server 2.1 beta
Sapienti sat!
Re[46]: Write in Brainfuck!
От: Turtle.BAZON.Group  
Дата: 25.12.06 15:25
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Windows/Linux — это монолитные ОС. Для реал-тайма там просто при

C>необходимости само ядро вытесняется специальным real-time ядром.

Ок. Только я не понял, заявленная производителями и последней веткой 2.6.18 hard real-time это что?
... << RSDN@Home 1.2.0 alpha rev. 669>>
Re[47]: Write in Brainfuck!
От: Cyberax Марс  
Дата: 25.12.06 15:41
Оценка:
Turtle.BAZON.Group wrote:
> C>Windows/Linux — это монолитные ОС. Для реал-тайма там просто при
> C>необходимости само ядро вытесняется специальным real-time ядром.
> Ок. Только я не понял, заявленная производителями и последней веткой
> 2.6.18 hard real-time это что?
Посмотри на гарантированую максимальную латентность и сравни с QNXом
Posted via RSDN NNTP Server 2.1 beta
Sapienti sat!
Re[48]: Write in Brainfuck!
От: Turtle.BAZON.Group  
Дата: 27.12.06 06:13
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Посмотри на гарантированую максимальную латентность и сравни с QNXом


Только это? Или hard является потому, как обеспечивает гарантированное время отклика, независимо от того, какая величина этой латентности? И по этой латентности определяется какой real-time хардовее?
... << RSDN@Home 1.2.0 alpha rev. 669>>
Re[49]: Write in Brainfuck!
От: Cyberax Марс  
Дата: 27.12.06 09:48
Оценка: +1
Turtle.BAZON.Group wrote:
> C>Посмотри на гарантированую максимальную латентность и сравни с QNXом
> Только это? Или hard является потому, как обеспечивает гарантированное
> время отклика, независимо от того, какая величина этой латентности?
Именно. Система, которая будет гарантировано отвечать в течение суток —
будет hard realtime. Другое дело, что такой realtime нафиг никому не нужен.

> И по этой латентности определяется какой real-time хардовее?

Нет, задержка определяет, для каких задач такой realtime будет подходить.
Posted via RSDN NNTP Server 2.1 beta
Sapienti sat!
Re[23]: Write in Nemerle!
От: ie Россия http://ziez.blogspot.com/
Дата: 04.01.07 07:19
Оценка: 5 (1)
Здравствуйте, R.K., Вы писали:

RK>Вот, например, поиск простых чисел.

RK>Этот вариант на Хаскеле я сделал сам, он самый быстрый из доступных:
RK>
-- code skipped
RK>


RK>Результат вычисления программы — количество простых чисел в интервале [100000000;120000000] = 1080193. Вычисляется на P4-2.8 за 14 сек.

RK>Сможешь написать функцию, подобную primesFromTo, только без использования ленивости?
RK>primesFromTo принимает min и max границы и выдает список всех простых чисел в интервале.

Решил после "великой попойки" (еще раз с праздником! ) заняться таки чем-нибудь. Вообщем, я, как человек почти не знающий Хаскель, не смог разобраться в твоем коде. Помогай!

Во-первых, код не скомпилировался ни ghc6.4.2:

primes.hs:43:8: parse error (possibly incorrect indentation)

, ни hugs98 (Version: 20051031):

ERROR file:{Hugs}\packages\hugsbase\Hugs\ST.hs:51 — Syntax error in type expression (unexpected `.')

, т.е. hugs даже import сделать не смог.

Во-вторых, так и не смог разобраться в функции genMap, прокомментарь плз. ее.

Пока сделал на Немерле "неленивую" версию, работает ни ахти как быстро, но, думаю, надо улучшать алгоритм, как-то он меня пока смущает.

Кстати, читал где-то, что на J (в котором ленивостью и не пахнет) достаточно неплохая (в плане скорости) работа с простыми числами. Решил проверить:

1. Количество простых чисел в интервале:
  NB. собственно сам глагол вычисляющий нужное нам количество
   cntPrimesFromTo =. -/@:(_1&p:)@|.
  NB. его использование
   cntPrimesFromTo 100000000 120000000
1080193
  NB. замер производительности, в секундах!
   6!:2 'cntPrimesFromTo 100000000 120000000'
0.0616224

Впечатляет?! Никакими 14ю секундами и не пахнет, и никакой ленивости. Хотя надо признать, я тут маленько смухлевал, т.к. cntPrimesFromTo считает количество простых чисел не создавая их списка, как это делает primesFromTo. Исправлюсь:

2. Список простых чисел в интервале:
  NB. глагол вычисляющий список простых чисел в заданном интервале
   primesFromTo =. [: p: ({.+i.@({:-{.))@(_1&p:)
  NB. его использование
   primesFromTo 100000000 120000000
100000007 100000037 100000039 100000049 100000073 100000081 100000123 100000127 100000193 100000213 100000217 100000223 100000231 100000237 100000259 100000267 100000279 100000357 100000379 100000393 100000399 100000421 100000429 100000463 100000469 100000...
  NB. длина возвращаемого им списка
   # primesFromTo 100000000 120000000
1080193
  NB. замер производительности
   6!:2 '# primesFromTo 100000000 120000000'
0.316999

Медленней, конечно, но все равно, даже пол-секунды не потребовалось.

В любом случае, повторить твой вариант на Немерле хотелось бы, но разобраться бы сперва
... << RSDN@Home 1.2.0 alpha rev. 655>>
Превратим окружающую нас среду в воскресенье.
Re[24]: Write in Nemerle!
От: palm mute  
Дата: 04.01.07 08:39
Оценка:
Здравствуйте, ie, Вы писали:

Я помогу по мелочам, вопросы по работе программы — к автору.
ie>Во-первых, код не скомпилировался ни ghc6.4.2:
ie>

ie>primes.hs:43:8: parse error (possibly incorrect indentation)

Copy-paste, здесь отступы ghc устраивают:
sqrtInt x
    | x<0 = error "sqrt negative number"
    | otherwise = rec 1
    where rec y
              | y==avg = y
              | y==avg-1 = if avg*avg==x then avg else y
              | otherwise = rec avg
              where avg = (y+x`quot`y)`quot`2

ie>, ни hugs98 (Version: 20051031):
ie>

ie>ERROR file:{Hugs}\packages\hugsbase\Hugs\ST.hs:51 — Syntax error in type expression (unexpected `.')

ie>, т.е. hugs даже import сделать не смог.
Unboxed массивы используют монаду ST, которая не поддерживается стандартным Haskell 98. Hugs нужно запускать с включенными расширениями (ключ -98 из командной строки или File/Options/"Allow hugs/ghc extensions" в WinHugs). Но эту программу запускать под интерпретатором не рекомендуется, ее нужно компилировать с оптимизацией.

ie>Впечатляет?! Никакими 14ю секундами и не пахнет, и никакой ленивости. Хотя надо признать, я тут маленько смухлевал, т.к. cntPrimesFromTo считает количество простых чисел не создавая их списка, как это делает primesFromTo. Исправлюсь:

Круто . Надо таки разобраться с J.
Re[24]: Write in Nemerle!
От: R.K. Украина  
Дата: 04.01.07 19:42
Оценка:
Здравствуйте, ie, Вы писали:

ie>Во-вторых, так и не смог разобраться в функции genMap, прокомментарь плз. ее.


Все просто на самом деле
primes@(_:tpr) = 2 : 3 : (concatMap (uncurry genMap) $ zip primes tpr)

-- эта функция фактически является оптимизацией genMap' (см. ниже)
genMap 2 3 = [5,7] -- special case, even p0^2
genMap p0 p1 = arrayFilter lo lo' $ accum (flip const)
    (listArray (lo', hi'-1) $ repeat True :: UArray Integer Bool)
    [ (j, False)
    | i <- takeWhile (<p1) $ tail primes
    , j <- takeWhile (<hi') $ iterate (+i) $
        (i*(incIfEven $ correctRem $ lo `quotRem` i)) `quot` 2
    ]
    where
    lo = p0^2; hi = p1^2
    lo' = lo `quot` 2; hi' = hi `quot` 2
    correctRem (q,0) = q
    correctRem (q,_) = q+1
    incIfEven n
        | even n = n+1
        | otherwise = n
    arrayFilter n i a
        | i==hi' = []
        | a!i = n : arrayFilter (n+2) (i+1) a
        | otherwise = arrayFilter (n+2) (i+1) a

-- так выглядел первоначальный вариант genMap с фильтрацией списков:
genMap' 2 3 = [5,7] -- специальный случай, 2^2=4 - четное число
genMap' p0 p1 = -- реализация решета Эратосфена на ленивых списках
    foldl -- свертка слева списка потенциальных простых чисел со списком уже известных простых чисел
        (\l i -> fun l i (i*(quot lo i))) -- применение функции, отфильтровывающей составные числа
        [lo,lo+2..hi-2] -- список нечетных чисел от p0^2 до (p1^2-2) (из него будут вычеркиваться составные числа)
        (takeWhile (<p1) $ tail primes') -- список простых чисел меньших p1
    where
    lo = p0^2; hi = p1^2
    -- fun вычеркивает из списка все числа кратные d, начиная с c
    fun [] _ _ = []
    fun l@(h:t) d c
        | h==c = fun t d (c+d)
        | h>c = fun l d (c+d)
        | otherwise = h : fun t d c

primes'@(_:tpr) = 2 : 3 : (concatMap (uncurry genMap') $ zip primes' tpr)


ie>1. Количество простых чисел в интервале:

ie>...
ie>Впечатляет?! Никакими 14ю секундами и не пахнет, и никакой ленивости. Хотя надо признать, я тут маленько смухлевал, т.к. cntPrimesFromTo считает количество простых чисел не создавая их списка, как это делает primesFromTo. Исправлюсь:

ie>2. Список простых чисел в интервале:

ie>...
ie>Медленней, конечно, но все равно, даже пол-секунды не потребовалось.

Ага, а если на C++ мой алгоритм переписать?

ie>В любом случае, повторить твой вариант на Немерле хотелось бы, но разобраться бы сперва


Ну теперь совсем просто будет
You aren't expected to absorb this
Re[25]: Write in Nemerle!
От: ie Россия http://ziez.blogspot.com/
Дата: 05.01.07 05:24
Оценка:
Здравствуйте, R.K., Вы писали:

ie>>Во-вторых, так и не смог разобраться в функции genMap, прокомментарь плз. ее.

RK>Все просто на самом деле
RK>
RK>primes@(_:tpr) = 2 : 3 : (concatMap (uncurry genMap) $ zip primes tpr)

RK>-- эта функция фактически является оптимизацией genMap' (см. ниже)
RK>genMap 2 3 = [5,7] -- special case, even p0^2
RK>genMap p0 p1 = arrayFilter lo lo' $ accum (flip const)
RK>    (listArray (lo', hi'-1) $ repeat True :: UArray Integer Bool)
RK>    [ (j, False)
RK>    | i <- takeWhile (<p1) $ tail primes
RK>    , j <- takeWhile (<hi') $ iterate (+i) $
RK>        (i*(incIfEven $ correctRem $ lo `quotRem` i)) `quot` 2
RK>    ]
RK>    where
RK>    lo = p0^2; hi = p1^2
RK>    lo' = lo `quot` 2; hi' = hi `quot` 2
RK>    correctRem (q,0) = q
RK>    correctRem (q,_) = q+1
RK>    incIfEven n
RK>        | even n = n+1
RK>        | otherwise = n
RK>    arrayFilter n i a
RK>        | i==hi' = []
RK>        | a!i = n : arrayFilter (n+2) (i+1) a
RK>        | otherwise = arrayFilter (n+2) (i+1) a

RK>-- так выглядел первоначальный вариант genMap с фильтрацией списков:
...
RK>


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

ie>>1. Количество простых чисел в интервале:

ie>>...
ie>>Впечатляет?! Никакими 14ю секундами и не пахнет, и никакой ленивости. Хотя надо признать, я тут маленько смухлевал, т.к. cntPrimesFromTo считает количество простых чисел не создавая их списка, как это делает primesFromTo. Исправлюсь:

ie>>2. Список простых чисел в интервале:

ie>>...
ie>>Медленней, конечно, но все равно, даже пол-секунды не потребовалось.

RK>Ага, а если на C++ мой алгоритм переписать?


Тут видишь в чем дело, вся эта ветка — спор "где нагляднее". Выдвинули предположение, о том, что ленивость в некоторых случаях делает код более наглядным, при этом можно не особо пролететь в производительности. Что ты собственно и показал своим примером. Так же, ты написал фразу:

Сможешь написать функцию, подобную primesFromTo, только без использования ленивости?

Причем, фраза эта звучала в контексте быстроты алгоритма. Т.о. я сделал предположение, что это быстродействие достигается за счет ленивости. Теперь я уж и не знаю, это ли ты имел ввиду.

По поводу переписывания на C++, опять же ленивости то нет, как ты функцию подобную primesFromTo писать собираешься?
А что до сравнения с J, то тут вряд ли что-то быстрее написать получится, а уж короче точно не выйдет Но J это вещь в себе, так что я бы стал пытаться с ним соревноваться в чем бы то нибыло, посмотреть для сравнения можно, а соревноваться — чур меня.

ie>>В любом случае, повторить твой вариант на Немерле хотелось бы, но разобраться бы сперва

RK>Ну теперь совсем просто будет

Хотелось бы все же сравнить эквивалентные варианты, а не тормозной с оптимизированным
... << RSDN@Home 1.2.0 alpha rev. 655>>
Превратим окружающую нас среду в воскресенье.
Re[26]: Write in Nemerle!
От: ie Россия http://ziez.blogspot.com/
Дата: 05.01.07 05:36
Оценка:
ie>А что до сравнения с J, то тут вряд ли что-то быстрее написать получится, а уж короче точно не выйдет Но J это вещь в себе, так что я бы НЕ стал пытаться с ним соревноваться в чем бы то нибыло, посмотреть для сравнения можно, а соревноваться — чур меня.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Превратим окружающую нас среду в воскресенье.
Re[26]: Write in Nemerle!
От: R.K. Украина  
Дата: 05.01.07 18:14
Оценка:
Здравствуйте, ie, Вы писали:

ie>Здравствуйте, R.K., Вы писали:


ie>>>Во-вторых, так и не смог разобраться в функции genMap, прокомментарь плз. ее.

RK>>Все просто на самом деле
RK>>
RK>>primes@(_:tpr) = 2 : 3 : (concatMap (uncurry genMap) $ zip primes tpr)

RK>>-- эта функция фактически является оптимизацией genMap' (см. ниже)
RK>>genMap 2 3 = [5,7] -- special case, even p0^2
RK>>genMap p0 p1 = arrayFilter lo lo' $ accum (flip const)
RK>>    (listArray (lo', hi'-1) $ repeat True :: UArray Integer Bool)
RK>>    [ (j, False)
RK>>    | i <- takeWhile (<p1) $ tail primes
RK>>    , j <- takeWhile (<hi') $ iterate (+i) $
RK>>        (i*(incIfEven $ correctRem $ lo `quotRem` i)) `quot` 2
RK>>    ]
RK>>    where
RK>>    lo = p0^2; hi = p1^2
RK>>    lo' = lo `quot` 2; hi' = hi `quot` 2
RK>>    correctRem (q,0) = q
RK>>    correctRem (q,_) = q+1
RK>>    incIfEven n
RK>>        | even n = n+1
RK>>        | otherwise = n
RK>>    arrayFilter n i a
RK>>        | i==hi' = []
RK>>        | a!i = n : arrayFilter (n+2) (i+1) a
RK>>        | otherwise = arrayFilter (n+2) (i+1) a
RK>>


Ну, что тут происходит... listArray создает массив Bool, представляющий нечетные числа от p0^2 до p1^2 (в целях экономии и скорости массив не содержит четные числа — это основная причина сложности), и инициализирует его True. Затем accum сбрасывает в False те элементы массива, которые соответствуют составным числам (вспоминаем genMap' и делаем подобно) — для этого создается специальный список с помощью list comprehension. Всякие correctRem и incIfEven нужны для правильного вычисления индексов массива (сейчас не скажу, почему именно так, это появилось во время отладки;). arrayFilter пробегается по массиву и строит соответствующий список (то, что ты выделил — взятие значения по индексу).

RK>>Ага, а если на C++ мой алгоритм переписать?


ie>Тут видишь в чем дело, вся эта ветка — спор "где нагляднее". Выдвинули предположение, о том, что ленивость в некоторых случаях делает код более наглядным, при этом можно не особо пролететь в производительности. Что ты собственно и показал своим примером. Так же, ты написал фразу:

ie>

ie>Сможешь написать функцию, подобную primesFromTo, только без использования ленивости?

ie>Причем, фраза эта звучала в контексте быстроты алгоритма. Т.о. я сделал предположение, что это быстродействие достигается за счет ленивости. Теперь я уж и не знаю, это ли ты имел ввиду.

Ты правильно все понял, я начал про С++ к тому, что в случае с J использовались явно стандартные средства генерации простых чисел, которые явно заоптимизированы до предела на низкоуровневом языке. И если уж сравнивать такое решение, то брать надо язык, соответствующий случаю. Вдобавок, очень возможно, что там совсем даже не классическое решето Эратосфена, а более современный шустрый алгоритм. Еще такое дело — посмотрел я этот p: в J и обнаружил, что он работает только в пределах 32 бит (до 2Г), если же в genMap в декларации типа массива заменить Integer на Int, время моего теста сократится до 8 сек. Еще можно подумать об ограничении ленивости расстановкой seq, там где нужно — если кто-нибудь достигнет в этом успеха, будет интересно посмотреть

ie>По поводу переписывания на C++, опять же ленивости то нет, как ты функцию подобную primesFromTo писать собираешься?


Ну будет не так кратко, но что быстрее в 4-8 раз — почти не сомневаюсь
You aren't expected to absorb this
Re[27]: Write in Nemerle!
От: VladD2 Российская Империя www.nemerle.org
Дата: 06.01.07 07:16
Оценка:
Здравствуйте, R.K., Вы писали:

RK>Ну, что тут происходит... listArray создает массив Bool, представляющий нечетные числа от p0^2 до p1^2 (в целях экономии и скорости массив не содержит четные числа — это основная причина сложности), и инициализирует его True. Затем accum сбрасывает в False те элементы массива, которые соответствуют составным числам (вспоминаем genMap' и делаем подобно) — для этого создается специальный список с помощью list comprehension. Всякие correctRem и incIfEven нужны для правильного вычисления индексов массива (сейчас не скажу, почему именно так, это появилось во время отладки;). arrayFilter пробегается по массиву и строит соответствующий список (то, что ты выделил — взятие значения по индексу).


А тебе не кажется, что для простоты, понимания и отсуствия обмана было бы проще не решать непонятную комплексную задачу, а просто описать конкретно то что ты хочешь и поглядеть как этого же можно достичь другими средствами?
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[28]: Write in Nemerle!
От: R.K. Украина  
Дата: 06.01.07 08:38
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>А тебе не кажется, что для простоты, понимания и отсуствия обмана было бы проще не решать непонятную комплексную задачу, а просто описать конкретно то что ты хочешь и поглядеть как этого же можно достичь другими средствами?


Вроде вполне конкретно написал, что хочется.

Сможешь написать функцию, подобную primesFromTo, только без использования ленивости?
primesFromTo принимает min и max границы и выдает список всех простых чисел в интервале.

Причем совсем не имел в виду переписывание именно моего алгоритма — можно использовать любой, хотя желательно, чтобы был реализован метод Эратосфена, ибо нежелательно сравнивать слишком отличающиеся алгоритмы. Какие есть возражения?
You aren't expected to absorb this
Re[29]: Write in Nemerle!
От: VladD2 Российская Империя www.nemerle.org
Дата: 06.01.07 16:17
Оценка:
Здравствуйте, R.K., Вы писали:

RK>Вроде вполне конкретно написал, что хочется.

RK>

Сможешь написать функцию, подобную primesFromTo, только без использования ленивости?
RK>primesFromTo принимает min и max границы и выдает список всех простых чисел в интервале.

RK>Причем совсем не имел в виду переписывание именно моего алгоритма — можно использовать любой, хотя желательно, чтобы был реализован метод Эратосфена, ибо нежелательно сравнивать слишком отличающиеся алгоритмы. Какие есть возражения?

Очень простые. Это очередная бессмысленная задача. Пути решения ясны как божий день (использование циклов, итераторов или их сочетания), но смысл решения пдобных задач от меня ускользает.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[30]: Write in Nemerle!
От: R.K. Украина  
Дата: 06.01.07 18:53
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, R.K., Вы писали:


RK>>Какие есть возражения?


VD>Очень простые. Это очередная бессмысленная задача. Пути решения ясны как божий день (использование циклов, итераторов или их сочетания), но смысл решения пдобных задач от меня ускользает.


Для императивного стиля сказать, что "пути решения состоят в использовании циклов, итераторов или их сочетания" — это все равно, что для ФС "использование рекурсии, композиции функций, монад, стрелок или их сочетания". Смысл же решения этой задачи в том, чтобы посмотреть, насколько лучше становится реализация от наличия в языке ленивости по умолчанию.
ie насчет смысла хорошо сказал:

Тут видишь в чем дело, вся эта ветка — спор "где нагляднее". Выдвинули предположение, о том, что ленивость в некоторых случаях делает код более наглядным, при этом можно не особо пролететь в производительности. Что ты собственно и показал своим примером. [...] Т.о. я сделал предположение, что это быстродействие достигается за счет ленивости.

You aren't expected to absorb this
Re[27]: Write in Nemerle!
От: ie Россия http://ziez.blogspot.com/
Дата: 07.01.07 20:42
Оценка: 15 (1)
Здравствуйте, R.K., Вы писали:

Сразу оговорюсь, повторить твой код в Немерле 1-в-1 не получилось. Да и смысла это лишено. А получилось собственно вот что (алгоритм поиска простых оставил прежний — Эратосфена):
using System
using System.Collections.Generic
using System.Console
using System.Diagnostics
using Nemerle.Utility

def _primes = List.[int]([3])

def primesFromTo(__from, __to, lst)

    def doWhenEven = (x,f) => if (x%2 == 0) f(x) else x
    def from = doWhenEven(__from, _+1)
    def to   = doWhenEven(__to, _-1)
    def sqrt = x => Math.Ceiling(Math.Sqrt(x)) :> int
    when (sqrt(to) > 5)
        primesFromTo(5, sqrt(to), _primes)

    def diff = (to - from)/2
    def arr = array.[bool](diff)
    def num = x => x*2+from
    mutable sindex
    def findIndex(p, i) { if (num(i)%p == 0) i else findIndex(p, i+1) }
    def eratosthenes = (p, i) => $[i,i+p..arr.Length-1].Iter(j => arr[j] = true) // (**)
    def addCulculated = (s, e) => $[s..e-1].Filter(j => !arr[j]).Iter(j => lst.Add(num(j))) // (++)

    for (mutable i; i < _primes.Count; i++)
        def p = _primes[i]
        def sq = x => Math.Pow(x,2) :> int
        when (num(sindex) < sq(p))
          def d = (sq(p) - num(sindex))/2
          addCulculated(sindex, Math.Min(sindex+d, diff))
          sindex += d
        eratosthenes(p, findIndex(p, sindex))
    addCulculated(sindex, diff)

def sw = Stopwatch()
def lst = List.[int]()
sw.Start()
primesFromTo(100000000, 120000000, lst)
sw.Stop()
WriteLine($"Elapsed: $(sw.Elapsed.TotalSeconds) ;; Count: $(lst.Count)")


>out.exe
Elapsed: 8.0298764 ;; Count: 1080193


ie>>По поводу переписывания на C++, опять же ленивости то нет, как ты функцию подобную primesFromTo писать собираешься?

RK>Ну будет не так кратко, но что быстрее в 4-8 раз — почти не сомневаюсь

Можно и в моем варианте еще немного пооптимизировать. Например, избавится от основных тормозов — списков в строчках (**) и (++), заменить их соответственно на
    def eratosthenes = (p, i) => 
        foreach (j in [i,i+p..arr.Length-1])
            arr[j] = true;
    def addCulculated = (s, e) => 
        foreach (j in [s..e-1])
            when (!arr[j])
                lst.Add(num(j));


>out.exe
Elapsed: 1.1022526 ;; Count: 1080193

... << RSDN@Home 1.2.0 alpha rev. 655>>
Превратим окружающую нас среду в воскресенье.
Re[28]: Write in Nemerle!
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.01.07 05:36
Оценка:
Здравствуйте, ie, Вы писали:

Здорово. Теперь объясните мне, пожайлуста, какие выводы из этой пенесометрии можно сделать?

Я лично вижу только один вывод императив рулит с точки зрения скорости и зачастую устраняет необходимость в ленивости.
Но эти выводы я и без этого мог сделать.

ЗЫ

Собственно интересуют ответы обоих сторон.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[29]: Write in Nemerle!
От: ie Россия http://ziez.blogspot.com/
Дата: 08.01.07 06:02
Оценка: :)
Здравствуйте, VladD2, Вы писали:

VD>Здорово. Теперь объясните мне, пожайлуста, какие выводы из этой пенесометрии можно сделать?


Да фиг знает, если честно.
Вчера вечером о выводах как-то недумалось — спать хотелось. Сегодня утром сделал вывод, что надо было плюнуть на все и идти таки спать
Вообщем вывод который я для себя сделал, пора завязывать с пенесометрией! Вот только alpha-blend на J сделаю, уже пообещал Хропову
... << RSDN@Home 1.2.0 alpha rev. 655>>
Превратим окружающую нас среду в воскресенье.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.