Jump to content

Байтовое сито

Byte Sieve — это компьютерная реализация «Решета Эратосфена», опубликованная компанией Byte в качестве языка программирования теста производительности . Впервые он появился в сентябрьском номере журнала 1981 года и время от времени к нему пересматривался. Несмотря на то, что он предназначен для сравнения производительности разных языков на одних и тех же компьютерах, он быстро стал широко используемым машинным тестом.

Sieve был одним из наиболее популярных тестов в эпоху домашних компьютеров , вторым был тест Creative Computing Benchmark 1983 года и тесты Rugg/Feldman , которые в ту эпоху чаще всего встречались в Великобритании. Позже в 1995 году компания Byte опубликовала более подробный NBench , заменив его.

Происхождение

[ редактировать ]

Джим Гилбрит из Центра военно-морских океанских систем в течение некоторого времени рассматривал идею написания небольшой программы сравнительного анализа языков, желая, чтобы она была переносимой на разные языки, достаточно маленькой, чтобы программный код умещался на одной печатной странице, и не полагаться на определенные функции, такие как аппаратное умножение или деление. Решение было вдохновлено встречей с Чаком Форсбергом на собрании USENIX в январе 1980 года в Боулдере, штат Колорадо , где Форсберг упомянул реализацию сита, написанную Дональдом Кнутом . [1] [2]

Гилбрит считал, что сито будет идеальным эталоном, поскольку оно позволяет избежать непрямых тестов арифметической производительности, которая сильно различается в зависимости от системы. Алгоритм в основном уделяет особое внимание производительности поиска в массиве, а также базовой логике и возможностям ветвления. Он также не требует каких-либо дополнительных функций языка, таких как рекурсия или расширенные типы коллекций. Единственным изменением оригинальной версии Кнута было удаление умножения на два и замена его сложением. В исходной версии машины с аппаратными множителями работали бы настолько быстрее, что остальная часть производительности была бы скрыта. [1]

После шести месяцев усилий по портированию его на максимальное количество платформ, к которым у него был доступ, первые результаты были представлены в сентябрьском выпуске журнала Byte за 1981 год в статье, озаглавленной «Эталон языка высокого уровня». [1] Гилбрет поспешил отметить следующее:

Я должен подчеркнуть, что этот тест — не единственный критерий, по которому можно судить о языке или компиляторе. [1]

В статье представлены эталонные реализации на десяти языках, включая более популярные варианты, такие как BASIC , C , Pascal , COBOL и FORTRAN , а также некоторые менее известные примеры, такие как Forth , ZSPL , Ratfor , PL/1 и PLMX . [3]

Примеры запуска были предоставлены для различных машин, в основном на базе Zilog Z80 или MOS 6502 . Первоначально лучшее время составило 16,5 секунды, которое показал Ratfor на машине Z80 с частотой 4 МГц, но Гэри Килдалл лично предоставил версию в Digital Research . прототипе версии PL/1 от [4] который пробежал за 14 секунд и установил отметку для этой первой коллекции. Самым медленным был Microsoft COBOL на той же машине, который занял целых 5115 секунд (почти полтора часа), что даже больше, чем у интерпретируемых языков, таких как BASIC. [5] Примечательной особенностью этого первого запуска было то, что C, Pascal и PL/1 показали примерно одинаковую производительность, что легко обогнало различные интерпретаторы. [4]

Второй набор тестов был проведен на более мощных машинах: Motorola 68000 ассемблер показал самое быстрое время — 1,12 секунды, немного обойдя C на PDP-11/70 и почти вдвое быстрее, чем ассемблер 8086. У большинства PDP-11 и HP-3000 время было намного медленнее, порядка 10–50 секунд. [6] Тесты на этих машинах с использованием только языков высокого уровня проводил NBS Pascal на PDP-11 за 2,6 секунды. [7]

UCSD Pascal предоставил еще один интересный набор результатов, поскольку одну и ту же программу можно запускать на нескольких машинах. Работая на выделенной машине Ithaca InterSystems Pascal-100, компьютере на базе Pascal MicroEngine , он работал за 54 секунды, в то время как на Z80 это было 239, а на Apple II — 516. [7]

Распространение

[ редактировать ]

Гилбрит, на этот раз вместе со своим братом Гэри, вновь обратился к коду в январском выпуске журнала Byte 1983 года . В этой версии удалено большинство менее популярных языков, оставлены Паскаль, C, FORTRAN IV и COBOL, но добавлены Ada и Modula-2 . Благодаря тому, что читатели предоставили дополнительные образцы, количество машин, операционных систем и языков, сравниваемых в итоговых таблицах, было значительно расширено. [8]

Сборка Motorola 68000 (68k) осталась самой быстрой, почти в три раза превосходя по скорости Intel 8086 , работающую на той же тактовой частоте 8 МГц. При использовании языков высокого уровня эти два процессора были ближе по производительности: 8086 в целом был вдвое медленнее, чем 68k, а часто и намного ближе. [9] Также было включено более широкое разнообразие мини-компьютеров и мэйнфреймов , время которых обычно превосходило 68k, за исключением самых быстрых машин, таких как IBM 3033 , и высокопроизводительных моделей VAX . Старые машины, такие как Data General Nova , PDP-11 и HP-1000, были далеко не такими быстрыми, как 68k. [8]

Вторая статья Гилбрита появилась в тот момент, когда эталонный тест стал довольно распространенным способом сравнения производительности различных машин, не говоря уже о языках. Несмотря на его первоначальное предупреждение не делать этого, вскоре это стало появляться в журнальной рекламе как способ сравнить результаты с конкурентами. [10] [11] и как общий ориентир. [12]

Позже, в августе 1983 года, Байт еще раз вернулся к решету в рамках целой журнальной серии статей о языке C. В этом случае использование больше соответствовало первоначальному замыслу: использование одного исходного кода и запуск его на одной машине для сравнения производительности компиляторов C в операционной системе CP/M-86 . [13] на КП/М-80 , [14] и для IBM PC . [15]

Несмотря на беспокойство Гилбрита в исходной статье, к этому времени код стал почти универсальным для тестирования, и в одной из статей отмечалось, что «Решето Эратосфена является обязательным тестом». [13] Он был включен в пакет Byte UNIX Benchmark Suite, представленный в августе 1984 года. [16]

Продолжают появляться новые версии кода для новых языков. [17] например, Rosetta Code и GitHub имеют множество доступных версий. [18] Его часто используют как пример функционального программирования, несмотря на то, что в распространенной версии алгоритм сита фактически не используется. [19]

Выполнение

[ редактировать ]

Предоставленная реализация рассчитывала только нечетные простые числа, поэтому массив элементов 8191 фактически представлял простые числа меньше 16385. Как показано в таблице на боковой панели, 0-й элемент представлял собой 3, 1-й элемент — 5, 2-й элемент — 7 и так далее.

Это оригинальная версия кода на языке BASIC, представленная в 1981 году. [20] [а] Диалект не указан, но ряд деталей означает, что он не работает в ранних версиях Microsoft BASIC (4.x и более ранних версиях), в том числе использование длинных имен переменных, таких как SIZE и FLAGS. Отсутствие номеров строк может указывать на разновидность миникомпьютера, считывающего исходный код из текстового файла, но также это могло быть и ошибкой печати.

REM Eratosthenes Sieve Prime Number Program in BASIC 
1 SIZE = 8190
2 DIM FLAGS(8191)
3 PRINT "Only 1 iteration"
5 COUNT = 0
6 FOR I = 0 TO SIZE
7 FLAGS (I) = 1
8 NEXT I
9 FOR I = 0 TO SIZE
10 IF FLAGS (I) = 0 THEN 18
11 PRIME = I+I + 3
12 K = I + PRIME
13 IF K > SIZE THEN 17
14 FLAGS (K) = 0
15 K = K + PRIME
16 GOTO 13
17 COUNT = COUNT + 1
18 NEXT I
19 PRINT COUNT," PRIMES"

И в C, с некоторыми корректировками пробелов по сравнению с оригиналом: [21]

#define true 1
#define false 0
#define size 8190
#define sizepl 8191
char flags[sizepl];
main() {
    int i, prime, k, count, iter; 
    printf("10 iterations\n");
    for (iter = 1; iter <= 10; iter ++) {
        count=0 ; 
        for (i = 0; i <= size; i++)
            flags[i] = true; 
        for (i = 0; i <= size; i++) { 
            if (flags[i]) {
                prime = i + i + 3; 
                k = i + prime; 
                while (k <= size) { 
                    flags[k] = false; 
                    k += prime; 
                }
                count = count + 1;
            }
        }
    }
    printf("\n%d primes", count);
}

Примечания

[ редактировать ]
  1. ^ Обратите внимание, что номер первой строки отсутствует в исходном списке исходного кода.
  1. ^ Перейти обратно: а б с д Гилбрит 1981 , с. 180.
  2. ^ Кнут 1969 , стр. 416, 658.
  3. ^ Гилбрит 1981 , стр. 181–190.
  4. ^ Перейти обратно: а б Гилбрит 1981 , стр. 194.
  5. ^ Гилбрит 1981 , стр. 195.
  6. ^ Гилбрит 1981 , стр. 193.
  7. ^ Перейти обратно: а б Гилбрит 1981 , стр. 196.
  8. ^ Перейти обратно: а б Гилбрит и Гилбрит 1983 , с. 294.
  9. ^ Гилбрит и Гилбрит 1983 , с. 292.
  10. ^ "HS/FORTH (реклама)" (PDF) . Технический журнал ПК . Октябрь 1985 г. с. 132.
  11. ^ «FORTH теперь очень.быстр (реклама)» (PDF) . ЧЕТВЕРТОЕ Размеры . Ноябрь – декабрь 1985 г. с. 2.
  12. ^ Чиарсия, Стив (1979). Подвал Циарсии, Том 6 . Цепь подвала. п. 133. ИСБН  9780070109681 .
  13. ^ Перейти обратно: а б Хьюстон, Джерри; Бродрик, Джим; Кент, Лес (август 1983 г.). «Сравнение компиляторов C для CP/M-86» . Байт . стр. 82–106.
  14. ^ Керн, Кристофер (август 1983 г.). «Пять компиляторов C для CP/M-80» . Байт . стр. 110–130.
  15. ^ Франер, Ральф (август 1983 г.). «Девять компиляторов C для IBM PC» . Байт . стр. 134–168.
  16. ^ Хиннант, Дэвид (август 1984 г.). «Сравнительный анализ UNIX-систем: производительность UNIX на микрокомпьютерах и миникомпьютерах» . Байт . стр. 132–135, 400–409.
  17. ^ «Стремительное решето Эратосфена» . 27 июля 2015 г.
  18. ^ «Решето Эратосфена» . Гитхаб . Проверено 2 мая 2019 г.
  19. ^ О'Нил, Мелисса (январь 2009 г.). «Подлинное решето Эратосфена» . Журнал функционального программирования . 19 (1): 95–106. дои : 10.1017/S0956796808007004 . S2CID   1309380 .
  20. ^ Гилбрит 1981 , с. 188.
  21. ^ Гилбрит 1981 , с. 186.

Библиография

[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 8bee8651cc6318e2f7b6dafdcc944f28__1718455740
URL1:https://arc.ask3.ru/arc/aa/8b/28/8bee8651cc6318e2f7b6dafdcc944f28.html
Заголовок, (Title) документа по адресу, URL1:
Byte Sieve - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)