Меряемся производительностью perft

Тема в разделе "Машинное отделение", создана пользователем WildCat, 4 июл 2007.

  1. Shark Учаcтник

    • Участник
    Рег.:
    30.06.2007
    Сообщения:
    124
    Симпатии:
    0
    Репутация:
    0
    Адрес:
    Барнаул
    Оффлайн
    Все-таки Intel Compiler хорошо выигрывает на 4м тесте. На P4-3000 тоже в среднем лучше чем MS (но совсем немного).
    Shark(P4-3000): 8.05 12.26 75.81 17.68

    PS. Теперь теоритические данные по компиляторам подтверждены практически.
  2. Shark Учаcтник

    • Участник
    Рег.:
    30.06.2007
    Сообщения:
    124
    Симпатии:
    0
    Репутация:
    0
    Адрес:
    Барнаул
    Оффлайн
    Прогрессивное человечество как раз на нашем уровне, а то и отстает (по генераторам ходов) [Сужу по исходникам]
    Просто Мюллер - впереди планеты всей :)

    Muller(P4-3000): 3.92 6.11 30.45 6.63
  3. WinPooh В.М.

    • Команда форума
    Рег.:
    13.02.2006
    Сообщения:
    9.491
    Симпатии:
    3.118
    Репутация:
    95
    Адрес:
    Москва
    Оффлайн
    С другой стороны, адаптировать программу Мюллера, чтобы она заиграла в силу WildCat, будет трудновато :)
  4. ProstoTak Старожил

    • Ветеран
    • Старожил
    Рег.:
    12.02.2006
    Сообщения:
    5.479
    Симпатии:
    123
    Репутация:
    1
    Оффлайн
    Я Мюллера ещё не копал, но неужели его генератор так трудно приспособить для реальной игровой проги? Если действительно игра не стоит свеч то лучше родной генератор использовать, в нём то хоть я знаю что к чему :)
  5. Shark Учаcтник

    • Участник
    Рег.:
    30.06.2007
    Сообщения:
    124
    Симпатии:
    0
    Репутация:
    0
    Адрес:
    Барнаул
    Оффлайн
    Я считаю, что все идеи там логичны, многим движкам - не противоричивы, и прикрутить их можно.
    Тем более, если пишешь новый движок, начиная с генератора.
  6. ProstoTak Старожил

    • Ветеран
    • Старожил
    Рег.:
    12.02.2006
    Сообщения:
    5.479
    Симпатии:
    123
    Репутация:
    1
    Оффлайн
    [c]
    ———————————————————————————————————————————————-
    | | Sempron 2295 | P4-3000 | Celeron - 950 |
    |——————————————————————————————————————————————-|
    | |Тест 1|Тест 2|Тест 3|Тест 4|Тест 1|Тест 2|Тест 3|Тест 4|Тест 1|Тест 2|Тест 3|Тест 4|
    |——————————————————————————————————————————————-|
    |WildCat | 7.89| 13.06| 76.14| 14.30| 7.50| 13.66| 74.88| 15.03| 21.48| 34.43|204.46| 40.22|
    |ProstoTak| 9.22| 13.09| 76.77| 18.75| 9.30| 13.65| 82.10| 20.65| 25.61| 35.92|197.68| 50.60|
    |Shark | 8.11| 12.17| 65.80| 14.78| 8.05| 12.26| 75.81| 17.68| 20.93| 32.78|175.39| 42.51|
    |Muller | 4.11| 6.23| 29.67| 6.44| 3.92| 6.11| 30.45| 6.63| 11.54| 17.75| 84.80| 18.41|
    ———————————————————————————————————————————————-
    [/c]
  7. TopicStarter Overlay

    WildCat Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    Это моя компиляция?
    А у тебя 3000 это реальная частота?

    Я бы не рискнул из кода Мюллера делать шахматную рпограмму :)
    С другой стороны можно попробовать понять идеи и сделать все по хорошему. Но возможно на этом потеряется немало, т.к. там множество не очень красивых трюков, которые придется выбросить.
  8. WinPooh В.М.

    • Команда форума
    Рег.:
    13.02.2006
    Сообщения:
    9.491
    Симпатии:
    3.118
    Репутация:
    95
    Адрес:
    Москва
    Оффлайн
    Думаю, что очень многие идеи из этого генератора Мюллер использует и в своей играющей программе MicroMax - кстати, участнице последнего чемпионата мира :)
  9. Shark Учаcтник

    • Участник
    Рег.:
    30.06.2007
    Сообщения:
    124
    Симпатии:
    0
    Репутация:
    0
    Адрес:
    Барнаул
    Оффлайн
    Да
    Да
  10. TopicStarter Overlay

    WildCat Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    Что-то он у тебя слишком шустро считает. :rolleyes:
  11. Shark Учаcтник

    • Участник
    Рег.:
    30.06.2007
    Сообщения:
    124
    Симпатии:
    0
    Репутация:
    0
    Адрес:
    Барнаул
    Оффлайн
    Насколько я понимаю по исходникам, Ни одной оригинальной идеи из perft в MicroMax не испльзутся. Так как у MicroMax другая цель: быть как можно меньше в исходниках, а не быстрее.
    Последняя: version 4.0 (1752 characters)
  12. Shark Учаcтник

    • Участник
    Рег.:
    30.06.2007
    Сообщения:
    124
    Симпатии:
    0
    Репутация:
    0
    Адрес:
    Барнаул
    Оффлайн
    Двуканальная память, большой кэш. Да и программы видимо неплохо чуствуют себя на длинном конвеере.
    При тестировании, останавливаю и выгружаю все что только можно. OS: Windows 2003 Server SP2
    В среднем по производительности однопоточных приложений равен моему домашнему. Athlon X2 3800+ (2000Mhz)
  13. ProstoTak Старожил

    • Ветеран
    • Старожил
    Рег.:
    12.02.2006
    Сообщения:
    5.479
    Симпатии:
    123
    Репутация:
    1
    Оффлайн
    [c]
    ———————————————————————————————————————————————-
    | | Sempron 2295 | P4-3000 | Celeron - 950 |
    |——————————————————————————————————————————————-|
    | |Тест 1|Тест 2|Тест 3|Тест 4|Тест 1|Тест 2|Тест 3|Тест 4|Тест 1|Тест 2|Тест 3|Тест 4|
    |——————————————————————————————————————————————-|
    |WildCat | 7.89| 13.06| 76.14| 14.30| 7.50| 13.66| 74.88| 15.03| 21.48| 34.43|204.46| 40.22|
    |ProstoTak| 9.22| 13.09| 76.77| 18.75| 9.30| 13.65| 82.10| 20.65| 25.61| 35.92|197.68| 50.60|
    |Shark | 8.11| 12.17| 65.80| 14.78| 8.05| 12.26| 75.81| 17.68| 20.93| 32.78|175.39| 42.51|
    |Muller | 4.11| 6.23| 29.67| 6.44| 3.92| 6.11| 30.45| 6.63| 11.54| 17.75| 84.80| 18.41|
    ———————————————————————————————————————————————-
    [/c]
  14. Shark Учаcтник

    • Участник
    Рег.:
    30.06.2007
    Сообщения:
    124
    Симпатии:
    0
    Репутация:
    0
    Адрес:
    Барнаул
    Оффлайн
    Ух, ну и намучился я с этим делом :)
    Подробности позднее, но предварительные результаты есть сейчас.

    Представьте: Делаю я первую версию, запускаю дома на AMD 2000Mhz, время = 5.25 с. Ну думю, на P4-3000 еще быстрее будет, (У Мюллера - быстрее). Приношу на работу, запускаю : 10.7 c .
    Вот это да!!! В 2 раза медленнее. Таких фокусов я еще не видел. Очень долго искал что тормозит программу, но нашел, слава богу. Сейчас все нормально.

    Кстати всем НАСТОЯТЕЛЬНО рекомендую изучить тему: Profile Guided Optimization.
    Моя программа, например, с помощью такой оптимизации ускоряется до 50% без изменения в коде.
    Жалко не использовал ее для предыдущих версий.
  15. TopicStarter Overlay

    WildCat Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    А где ее можно изучить? Есть где-то русские тексты по этому поводу?
  16. Shark Учаcтник

    • Участник
    Рег.:
    30.06.2007
    Сообщения:
    124
    Симпатии:
    0
    Репутация:
    0
    Адрес:
    Барнаул
    Оффлайн
    Я ее изучал методом тыка, без документации. День потратил, но не жалею.
    По русски вряд ли что найдешь. А так поиск по интернету выдает достаточно много материалов.
    Эта оптимизация поддерживется Интелом с 8й версии, MSVC с 2005. (Не во всех редакциях)
  17. WinPooh В.М.

    • Команда форума
    Рег.:
    13.02.2006
    Сообщения:
    9.491
    Симпатии:
    3.118
    Репутация:
    95
    Адрес:
    Москва
    Оффлайн
    gcc тоже поддерживает pgo
  18. ProstoTak Старожил

    • Ветеран
    • Старожил
    Рег.:
    12.02.2006
    Сообщения:
    5.479
    Симпатии:
    123
    Репутация:
    1
    Оффлайн
    Ты по людски обьясни. Ты в своём генераторе использовал идеи Мюллера? И теперь только 5 секунд против 8? И этот модифицированный генератор легко можно будет использовать непосредственно в шахматном движке?
  19. krey Михаил Кройтор

    • Команда форума
    Рег.:
    10.04.2006
    Сообщения:
    3.709
    Симпатии:
    50
    Репутация:
    1
    Адрес:
    Кишинев
    Оффлайн
    нет, он сначала запустил компиляцию с профилированием. после работы его программы, вторая компиляция использовала полученный профиль для того чтобы знать, что именно надо оптимизировать. обычно получается выигрыш до 30%. rtfm
  20. Shark Учаcтник

    • Участник
    Рег.:
    30.06.2007
    Сообщения:
    124
    Симпатии:
    0
    Репутация:
    0
    Адрес:
    Барнаул
    Оффлайн
    Да использовал, от него я взял общую последовательнсть генерации.
    Но структуры данных у меня отличаются. Обработка превращений - честная, а не как у Мюллера, EnPassant и рокировки тоже остались прежними.
    + Я нашел несколько мест где Мюллера можно улучшить, но это копейки.
    На этом генераторе будет работать мой движок. Это не чисто теоритическая разработка.
    В движке он будет помедленнее, так как в него добавится инкрементальная оценка позиции и хэша.
    5.25 это без PGO, С ним - 3.54 !! :cool:

    PS. Даже боюсь предположить за сколько Мюллер с PGO посчитает. :)
  21. Shark Учаcтник

    • Участник
    Рег.:
    30.06.2007
    Сообщения:
    124
    Симпатии:
    0
    Репутация:
    0
    Адрес:
    Барнаул
    Оффлайн
    Под общей последовательностью я понимаю во эту схему обработки
    1) связанные фигуры
    2) контактные шахи
    3) рокировки
    4) EnPassant
    5) Нейтрализация контактных шахов
    6) Общая генерация
    7) Ходы короля

    Ну и отсечение ходов, при которых король остается под шахом, у меня во время генерации делается, а не после совершения хода.
  22. TopicStarter Overlay

    WildCat Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    Может расскажешь вкратце как ее юзать? А то не хочется день на нее тратить.
  23. Shark Учаcтник

    • Участник
    Рег.:
    30.06.2007
    Сообщения:
    124
    Симпатии:
    0
    Репутация:
    0
    Адрес:
    Барнаул
    Оффлайн
    У меня в VS (System Architect edition) В контестном меню проекта есть пункт PGO. В VS Professional - его нет.
    1) PGO->Instrument. Добавляется остнастка к исполняемому файлу.
    2) PGO->Run Instrumented ... Собирается статистика времени выполнения, появляются файлы PGC и PGD
    3) PGO->Optimize.
    готово.
  24. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    Да чего тут рассказывать? Компилируешь с параметром prof-gen, prof-genx
  25. ProstoTak Старожил

    • Ветеран
    • Старожил
    Рег.:
    12.02.2006
    Сообщения:
    5.479
    Симпатии:
    123
    Репутация:
    1
    Оффлайн
    Shark, а мой генератор можешь компильнуть с этим PGO?
  26. TopicStarter Overlay

    WildCat Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    а дальше?
  27. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    Дальше запускаешь полученный Экзешник, формируется профайл, и комилируешь с его использованием (prof-use) Это всё для Интеловского компилятора, запускать лучше из коммандной строки.
    На моих тестах особой прибавки от этого нет. Но как я понял всё зависит от кода, если сам не проставил Инлайны, Статик, регистровые переменные - наверно тогда это даст прибавку.
  28. Shark Учаcтник

    • Участник
    Рег.:
    30.06.2007
    Сообщения:
    124
    Симпатии:
    0
    Репутация:
    0
    Адрес:
    Барнаул
    Оффлайн
    Похоже твоей программе PGO противопоказан, она с ним только медленнее
    P4-3000, VS 2005, ProstoTak:
    without PGO: 11.70 14.75 83.05 21.87
    with PGO: 11.87 15.86 81.91 22.86

    Код у тебя зашифрован,конечно, не по детски. И как ты в нем разбираешься. :)
  29. ProstoTak Старожил

    • Ветеран
    • Старожил
    Рег.:
    12.02.2006
    Сообщения:
    5.479
    Симпатии:
    123
    Репутация:
    1
    Оффлайн
    Да ничего там не зашифровано, просто комментарии поубирал. Как по мне то у меня самый удобочитаемый код, а вот все остальные просто кашмар на улице вязов :D
  30. Shark Учаcтник

    • Участник
    Рег.:
    30.06.2007
    Сообщения:
    124
    Симпатии:
    0
    Репутация:
    0
    Адрес:
    Барнаул
    Оффлайн
    Вот мой новый генератор
    http://dev.enterra-inc.com/perft/perft_pgo.zip

    Написать его пришлось практически с нуля. По схеме которую я привел выше. Мне, конечно, не превыкать. Все-таки уже четвертый генератор за последний месяц :)

    В отличии от Мюллера Мой новый генератор Очень Любит процессоры с коротким конвеером. На P4 работает в полтора раза хуже чем на AMD. PGO На P4 не дает практически ничего, А на AMD - Честных 40% выигрыша.
    Это при том что сама оптимизация проводилась на Intel!!

    В общем результаты такие:
    AMD Athlon X2 3800+: 3.47 5.13 26.58 5.48
    Intel Pentium 4 3000 : 5.77 8.95 45.87 8.56
    :p

    Пробуйте, запускайте у себя, обновляйте таблицу :)
    PS
    А когда-то я хотел остановиться на результате 22c
  31. TopicStarter Overlay

    WildCat Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    Просто жуть - Shark:
    3.03
    4.48
    23.38
    4.80

    Дай новые исходники глянуть. :)

    WildCat pgo : www.igorkorshunov.narod.ru/WildCat.rar
    7.50
    13.20
    72.42
    14.34

    У меня, кстати, только интеловский компилятор pgo поддерживает, а VC++ 2005 нет. :(

    Для моего реального шахматного движка pgo дает 10% ускорения для позиций, где много фигур. А для эндшпиля совсем чуть-чуть.
  32. Shark Учаcтник

    • Участник
    Рег.:
    30.06.2007
    Сообщения:
    124
    Симпатии:
    0
    Репутация:
    0
    Адрес:
    Барнаул
    Оффлайн
    Тут уже приключилась шумная история со стрелкой. Так, что я пока не готов делиться всеми исходниками. Могу показать лишь фрагменты. Смотрите Мюллера. Ничего принципиально нового у меня нет.
    Если желания и этузиазма не хватит дописать свой движок до конца, То не будет повода не поделиться.
    А пока хочу к сентябрю что, либо свое иметь :).

    Фрагменты:
    Код:
    // ход
    struct Move
    {
        Move()
        {
    #ifdef _DEBUG
            m_value = 0;
    #endif
        }
        
        bidx_t  from() const { return (m_value>>8) & 0xFF; }
        bidx_t  to() const { return m_value & 0xFF; }
        flag_t  flags() const { return m_value>>16; }
        piece_t promotion() const { return m_value>>24; }
    
        unsigned  m_value;
    };
    
    
    ....
    
    // флаги аттаки
    const attack_t A_KNIGHT     = 0x01;
    const attack_t A_BISHOP     = 0x02;
    const attack_t A_ROOK       = 0x04;
    const attack_t A_QUEEN      = A_ROOK | A_BISHOP;
    const attack_t A_WPAWN      = 0x08;
    const attack_t A_BPAWN      = 0x10;
    const attack_t A_KING       = 0x20;
    const attack_t A_HORIZONTAL = 0x40;
    const attack_t A_VERTICAL   = 0x80;
    
    const attack_t A_ANY_CONTACT_BLACK = A_KNIGHT | A_KING | A_BPAWN;
    const attack_t A_ANY_CONTACT_WHITE = A_KNIGHT | A_KING | A_WPAWN;
    
    ...
            // Pawn moves
            for( int i=PI_WHITE_PAWN_FIRST; i<m_whitePawnLast; i++ )
            {
                bidx_t pawnPos = m_positions[i];
                if( pawnPos==0 ) continue;
                int pawnPosPrepared = pawnPos << 8;
                int row = arIdxToRow[pawnPos];
                if( row==6 )
                {
                    pawnPosPrepared |= FL_PAWN_PROMOTION << 16;
                    if( m_cells[pawnPos+FIELD_WIDTH]==PI_EMPTY )
                    {
                        chunk.addPrepared( pawnPosPrepared | (PIECE_WHITE_QUEEN<<24), pawnPos+FIELD_WIDTH );
                        chunk.addPrepared( pawnPosPrepared | (PIECE_WHITE_ROOK<<24), pawnPos+FIELD_WIDTH );
                        chunk.addPrepared( pawnPosPrepared | (PIECE_WHITE_BISHOP<<24), pawnPos+FIELD_WIDTH );
                        chunk.addPrepared( pawnPosPrepared | (PIECE_WHITE_KNIGHT<<24), pawnPos+FIELD_WIDTH );
                    }
                    if( (m_cells[pawnPos+FIELD_WIDTH+1] & PI_COLOR_BITS)==PI_BLACK_BIT )
                    {
                        chunk.addPrepared( pawnPosPrepared | (PIECE_WHITE_QUEEN<<24), pawnPos+FIELD_WIDTH+1);
                        chunk.addPrepared( pawnPosPrepared | (PIECE_WHITE_ROOK<<24), pawnPos+FIELD_WIDTH+1 );
                        chunk.addPrepared( pawnPosPrepared | (PIECE_WHITE_BISHOP<<24), pawnPos+FIELD_WIDTH+1 );
                        chunk.addPrepared( pawnPosPrepared | (PIECE_WHITE_KNIGHT<<24), pawnPos+FIELD_WIDTH+1 );
                    }
                    if( (m_cells[pawnPos+FIELD_WIDTH-1] & PI_COLOR_BITS)==PI_BLACK_BIT )
                    {
                        chunk.addPrepared( pawnPosPrepared | (PIECE_WHITE_QUEEN<<24), pawnPos+FIELD_WIDTH-1 );
                        chunk.addPrepared( pawnPosPrepared | (PIECE_WHITE_ROOK<<24), pawnPos+FIELD_WIDTH-1 );
                        chunk.addPrepared( pawnPosPrepared | (PIECE_WHITE_BISHOP<<24), pawnPos+FIELD_WIDTH-1 );
                        chunk.addPrepared( pawnPosPrepared | (PIECE_WHITE_KNIGHT<<24), pawnPos+FIELD_WIDTH-1 );
                    }
                }
                else
                {
                    if( m_cells[pawnPos+FIELD_WIDTH]==PI_EMPTY )
                    {
                        chunk.addPrepared( pawnPosPrepared, pawnPos+FIELD_WIDTH );
                        if( row==1 &&  m_cells[pawnPos+2*FIELD_WIDTH]==PI_EMPTY )
                            chunk.addPrepared( pawnPosPrepared | (FL_PAWN_LONG_JUMP<<16), pawnPos+2*FIELD_WIDTH );
                    }
                    if( (m_cells[pawnPos+FIELD_WIDTH+1] & PI_COLOR_BITS)==PI_BLACK_BIT )
                        chunk.addPrepared( pawnPosPrepared, pawnPos+FIELD_WIDTH+1 );
                    if( (m_cells[pawnPos+FIELD_WIDTH-1] & PI_COLOR_BITS)==PI_BLACK_BIT )
                        chunk.addPrepared( pawnPosPrepared, pawnPos+FIELD_WIDTH-1 );
                }
            }
    
    ...
    
    void doWhiteMove( Move move, HistoryMove& history )
    {
        bidx_t from = move.from();
        bidx_t to = move.to();
    
        pidx_t figure = m_cells[from];
        pidx_t captured = m_cells[to];
    
        history.m_captured = captured;
        history.m_state = m_state;
    
        m_prevMove = move;
    
        m_cells[to] = figure;
        m_cells[from] = PI_EMPTY;
        m_positions[figure] = to;
        m_positions[captured] = 0;
    
        
        // handle special moves
        int flags = move.flags();
        if( flags & (FL_PAWN_PROMOTION | FL_PAWN_PASS_CAPTURE | FL_WHITE_SHORT_CASTLE | FL_WHITE_LONG_CASTLE) )
    ...
        {
  33. ProstoTak Старожил

    • Ветеран
    • Старожил
    Рег.:
    12.02.2006
    Сообщения:
    5.479
    Симпатии:
    123
    Репутация:
    1
    Оффлайн
    [c]
    ———————————————————————————————————————————————-
    | | Sempron 2295 | P4-3000 | Celeron - 950 |
    |——————————————————————————————————————————————-|
    | |Тест 1|Тест 2|Тест 3|Тест 4|Тест 1|Тест 2|Тест 3|Тест 4|Тест 1|Тест 2|Тест 3|Тест 4|
    |——————————————————————————————————————————————-|
    |WildCat | 7.50| 13.20| 72.42| 14.34| 7.50| 13.66| 74.88| 15.03| 21.48| 34.43|204.46| 40.22|
    |ProstoTak| 9.22| 13.09| 76.77| 18.75| 9.30| 13.65| 82.10| 20.65| 25.61| 35.92|197.68| 50.60|
    |Shark | 3.03| 4.48| 23.38| 4.80| 5.77| 8.95| 45.87| 8.56| 20.93| 32.78|175.39| 42.51|
    |Muller | 4.11| 6.23| 29.67| 6.44| 3.92| 6.11| 30.45| 6.63| 11.54| 17.75| 84.80| 18.41|
    ———————————————————————————————————————————————-
    [/c]
  34. TopicStarter Overlay

    WildCat Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
  35. ProstoTak Старожил

    • Ветеран
    • Старожил
    Рег.:
    12.02.2006
    Сообщения:
    5.479
    Симпатии:
    123
    Репутация:
    1
    Оффлайн
    [c]
    ———————————————————————————————————————————————-
    | | Sempron 2295 | P4-3000 | Celeron - 950 |
    |——————————————————————————————————————————————-|
    | |Тест 1|Тест 2|Тест 3|Тест 4|Тест 1|Тест 2|Тест 3|Тест 4|Тест 1|Тест 2|Тест 3|Тест 4|
    |——————————————————————————————————————————————-|
    |WildCat | 7.50| 13.20| 72.42| 14.34| 7.50| 13.66| 74.88| 15.03| 21.48| 34.43|204.46| 40.22|
    |ProstoTak| 8.98| 11.66| 73.02| 17.14| 9.30| 13.65| 82.10| 20.65| 25.61| 35.92|197.68| 50.60|
    |Shark | 3.03| 4.48| 23.38| 4.80| 5.77| 8.95| 45.87| 8.56| 20.93| 32.78|175.39| 42.51|
    |Muller | 4.11| 6.23| 29.67| 6.44| 3.92| 6.11| 30.45| 6.63| 11.54| 17.75| 84.80| 18.41|
    ———————————————————————————————————————————————-
    [/c]

Поделиться этой страницей