Back to site
Since 2004, our University project has become the Internet's most widespread web hosting directory. Here we like to talk a lot about web development, networking and server security. It is, after all, our expertise. To make things better we've launched this science section with the free access to educational resources and important scientific material translated to different languages.

Тэрміны выпрабаванняў, ці, Выпрабаванні Тэрміны: Эксперыменты з дапамогай сцэнарыяў і карыстацкіх інтэрфейсаў Мовы

Браян У. Керниган
Bell Laboratories
Мюрэй-Хіл, штат Нью-Джэрсі 07974
bwk@bell-labs.com
Крыстафер Дж. Ван Вік
Факультэт матэматыкі і камп'ютэрных навук
Дру універсітэт
Madison, NJ 07940
cvanwyk@drew.edu

РЭЗЮМЭ

Гэты артыкул апісвае некаторыя асноўныя эксперыменты, каб убачыць, як хутка розных папулярных моў сцэнарыяў і карыстальніцкі інтэрфейс быў запушчаны спектр прадстаўнік задач. Мы выявілі велізарныя змены ў прадукцыйнасці, у залежнасці ад шматлікіх фактараў, некаторыя некантралюемыя і Падзеі непознаваемое. Там, здаецца, мала надзеі Прагназаванне прадукцыйнасці ў іншых, чым найбольш агульным выглядзе, калі Там Ёсць адно ясна заключэнне, што ні вынікі па тэсціраванню павінны "быць калі-небудзь прымаць за чыстую манету.

Некалькі агульных прынцыпаў ўваходзяць:



* Скампіляваны код працуе хутчэй, чым звычайна тлумачыцца код: чым больш праграма "`` compiled''Before яна выконваецца, тым хутчэй ён будзе працаваць.

* Памяць пытанні, звязаныя з & эфекты памяці іерархіі, атрымалі шырокае распаўсюджванне: як памяць кіруецца, ад апаратных кэшаў для збору смецця, могуць абменьвацца Значнае час аўтаномнай працы. Тым не менш карыстальнікам непасрэдны кантроль над Have No большасць аспектаў кіравання памяццю.

* Тэрміны Праграмы і паслугі, атрыманыя ад аперацыйнай сістэмы з'яўляюцца цалкам недастатковымі. Гэта цяжка вымераць Runtimes Надзейна і repeatably нават для невялікіх, чыста вылічальных ядраў, і гэта становіцца значна складаней, калі шмат Ці праграма ўводу / вываду або графікі.

Хоць мова КОЖНАГА свеціць у некаторых сітуацыях, там бачныя і часам цалкам нечаканым Недахопы Што павінна быць яшчэ ў звычайных дадатках. Мы сутыкнуліся з памылкамі, абмежаванні па памеры, ніякавата асаблівасці, а агульная таямніцы для любога мовы.

BenchmarkingPerformance evaluationScripting мовах

УВОДЗІНЫ

Гэты артыкул апісвае эксперыменты з мэтай параўнання прадукцыйнасці скрыптовых моў (як Awk, Perl і Tcl) і інтэрфейс патэнцыялу мовах (напрыклад, Tck / Tk, Java і Visual Basic) уяўляе сабой набор прадстаўнік вылічальных задач. Мы знайшлі гэтую складаную, з цяжкасцямі і больш выразныя вынікі менш, чым мы чакалі.

З сцэнарыяў і інтэрфейс патэнцыялу мовы тлумачыцца як правіла, з выкарыстаннем ет Некаторыя ахвяры хуткасць у абмен на выгоды праграмавання. На гэты раз `` wasted''CPU не мае значэння, для сцісласці, праграмы аднаразовыя, або для праграм, якія працуюць толькі ў некалькіх "секунд, і не мае значэння, калі скрыптовая мова выкарыстоўваецца ў асноўным як `` glue''to кіравання Эфектыўнае буйнамаштабных аперацый. Праграмы для невялікі, але дробных наборы дадзеных канадскіх ператварыцца ў вялікія праграмы, якія мы запускаем вялікія наборы даных, напрыклад, Awk і Perl былі выкарыстаны для напісання праграм тысяч ліній Гэты працэс мегабайт набораў дадзеных. А часам клей Развіваецца сябе ў асноўных кампанентаў дадатку года. Па Колькасная як розныя мовы хутка бегаць, прадукцыйнасць параўнання могуць "прапаноўваць, якую б мэтазгодна мовы для розных акцый прымянення годзе, і што можа быць Штраф за зручнасці выбару за эфектыўнасцю.

На першы погляд, параўнанне Runtimes здаецца простым. Выберыце поўны набор прадстаўнік задачы, пісаць эквівалентных праграм на розных мовах, асяроддзі выканання меры на некалькі сістэм, то гэта іх усіх у табліцы. Гэта з'яўляецца відавочным абагульненнем падыходу выпрабаванні праграмы, якія ствараюць кошт мадэлі для прымітыўных аперацый у адной мове, як З [Bentley 91] і арыенціры, якія параўноўваюцца рэалізацыі адной мове, як Java [97 Хардвик, кафеін 97].

Мабыць лёгкая праца параўнання, аднак, аказалася значна больш, чым фізічных практыкаванняў. Мы сутыкнуліся з праблемамі, загадкі і сюрпрызы на кожным кроку. Спадзяемся, што гэты часопіс Наш дастаўцы заклікае чытачоў для прагляду апублікаваных Параўнанне з асцярогай, а таксама распрацаваць і выконваць свае ўласныя эксперыменты старанна.

Пры прадстаўленні вынікаў нашых эксперыментаў, у выхадныя дні часта кажуць, што праграма пабег на адной мове некаторы колькасць хутчэй павольней, чым золата год эквівалентнай праграмы на іншай мове. Усе такія выніковая ўяўляе здымак ў летам 1997 года, аб выкананні мовы працэсары даступныя, якія павінны былі нас. Тейс не даюць ордэр на высновы аб параўнальнай эфектыўнасці Іншыя мовы выкарыстоўваюць машыны або іншыя версіі праграмнага забеспячэння.

Хоць стан Многія Мы не можам абгрунтаваныя высновы, Ёсць некаторыя тэмы паўтараюцца Гэта часта апісваецца ў эксперыментах ніжэй.

* Кампіляцыя перамогі над інтэрпрэтацыяй, і гаворыць па-год прамежкавых Далучэнне прадстаўленне перамогі над інтэрпрэтацыяй праграму тэкст. Дакладнае паскарэнне непрадказальная, аднак, і кампіляцыі мая падзей замест запаволіць праграму. Па большай частцы, мы праверылі толькі перакладчыкаў, бо яны заўсёды даступныя, а часта эксперыментальныя кампілятары, без падтрымкі, пакуль няма, або дадатковай кошту годзе. Абмежаваныя вынікі, прадстаўленыя ў раздзеле 7 indicato гэтай кампіляцыі, як правіла, але не заўсёды, сціплы Cours.
* Памяць пытанні. Абсалютная колькасць інсульту была даступная машына важна, асабліва унцый падпампоўкі (або абмалоту) пачынаецца. Мэта буфераў і кэшаў (на некалькіх розных узроўнях апаратнага і праграмнага забеспячэння) і ажыццяўлення выдзялення памяці і зборка смецця канадскіх aussi мець драматычныя наступствы для прадукцыйнасці. Часта звязаны тэзіс фактараў, якія знаходзяцца па-за кантролю карыстальніка.
* Дакладныя тэрміны вельмі цяжка. Нават простыя тэрміны завесы выставу няўстойлівым асяроддзя выканання канадскіх без усялякай на тое прычыны. Пасля таго як праграма ІКТ ўзаемадзеяння з навакольным асяроддзем, робячы "значны ўводу / вываду ці графікі, змяненне часу выканання вымярэнняў падзея стане шырока. Дысертацыя добра вядомыя праблемы пагаршаюцца ненадзейных сістэм з `` internal''timing працэдур. Мы таксама не знойдзены спосаб загрузіць выдаткі запуску здавальняючым для ўсіх сістэм, таму галава ў галаву параўнанне паміж мовамі часам перакладаецца цяжкасці.

1 Метадалогія

Мы пачалі будаваць табліцы з трыма вымярэннямі: задачы, мова праграмавання, і машыны. У рэшце рэшт выхадныя Паведамленні Памер праблема вырашана праграмы чацвёртае вымярэнне, і прэзентацыя выхадныя змянілася з табліц да графікам. Праблема рознага памеру дапамаглі нам выявіць незвычайныя эфекты асяроддзя, а графічнае прадстаўленне падкрэслівае формы і тэндэнцыі ў рэжыме выканання, а не асобныя ацэнкі прадукцыйнасці.

Мы прадстаўляем вымярэнняў па кожнаму элементу задачы асобна. У адрозненне ад некаторых быў бенчмаркинга даследаванні, мы не аб'яднаць вынікі розных эксперыментаў у адзін нумар. Адна праблема з гэтай агульнай практыкі, што можна выбраць для стварэння розных вагавых каэфіцыентаў Амаль любы жаданы вынік [Бекер 87].

Выбар задачы

Цяжка валюце невялікі, але прадстаўнік задач, якія не даюць занадта вялікі краю да адной мовы празмерна караць яшчэ адну залатую. У ідэале, кожная задача будзе выпрабоўваць толькі адну ці дзве асаблівасці мовы, і запатрабуе кароткія, простыя, лёгкія і праграмы, якія з'яўляюцца натуральнымі для выражэння на любой мове. Для параўнання быць адчувальным aussi праграмы павінны быць выяўленыя ў `` colloquial''fashion на мове КОЖНАГА. Хоць мы не сьцьвярджаем, што любы з задач, суботах і нядзелях гэты з'яўляецца канчатковым, мы лічым, гэта значыць кожны разумна справядлівым.

У нас ёсць прэзентацыі, арганізаванай па тыпу задач: асноўныя асаблівасці мовы (раздзел 3), масівы і радкі (раздзел 4), уваход / выхад (раздзел 5); асноўныя аперацыі GUI (раздзел 6). Раздзел 7 апісвае эксперыменты з кампіляцыяй. Кожны раздзел ўключае ў сябе дадатковыя тлумачэнні задач. Праграмы і дадзеныя выпрабаванняў можна азнаёміцца ??на www.cs.bell-labs.com/ ~ BWK.

Выбар Мовы

Мы ажыццяўляем таймінгаў для васьмі мовах прадстаўленыя ў табліцы 1.





(1) Укладанне Tk для Perl і схема па ўсёй бачнасці, эксперыментальныя і падтрымкі, мы не спрабавалі іх.

Табліца 1: Характарыстыкі мовы



З уключаны ў базавы ўзровень: яго прадукцыйнасць прапануе Памер выканання штраф за выкарыстанне мовы тлумачыцца года. З толькі адзін з васьмі мовах, які не мае убудаваны ў радку аперацый і аўтаматычны збор смецця.

Awk і Perl падобныя па стылі, хоць Perl мае значна больш магчымасцяў. Радкі ды ліку толькі тыпы дадзеных, асацыятыўныя масівы структура боку гэтых (адзіны ў Awk) Звычайна Абодва вытлумачана. Адзін з аўтараў дазволіла на бацькаўскай цікавасць Awk.

З'яўляецца перакладчыкам Tcl нагадвае C абалонкі UNIX; радкоў, ён пастаўшчыка Асацыяцыі масіваў. Акрамя ТЗ карыстацкі інтэрфейс Інструментарый упакованы Звычайна для запуску з сцэнарыяў Tcl Праз `` shell''windowing назвай Wish. 7,6 чыста перакладчыка Tcl; апошнія Tcl 8.0 ўключае на-лета кампілятар байт-кода.

JAVA паходзіць ад C і C + +. Java пастаўляецца са стандартнай бібліятэкай карыстальніцкага інтэрфейсу, Abstract Window Toolkit AWT золата. Java-праграмы можна запускаць аўтаномна або як `` applets''Invoked з вэб-браўзэра, у любым выпадку, прамежкавае прадстаўленне тлумачыцца Можа Быць, можа быць золата ён складзены як раз да машыны, якая з'яўляецца праграмай Быццё Выканаць.

Visual Basic з'яўляецца інтэрпрэтаваны свабодна ў тым жа выглядзе класа Java. Яна забяспечвае годзе асабліва лёгка асяроддзе для стварэння графічных інтэрфейсаў. Visual Basic EST disponible толькі для Windows 95 і NT.

Limbo ці мова ў тым жа класе, як Java і напады Многае ж прадметнай вобласці Некалькі Тое ж самае з нумару, гэта таксама нармальна вытлумачана. Limbo З'яўляецца часткай Inferno, віртуальных аперацыйных сістэм на Windows Гэта Працуе 95 і NT многіх разнавіднасцяў Unix і. Limbo мае сваю ўласную рэалізацыю падлягае неадкладнаму ТЗ для стварэння графічных інтэрфейсаў. Аўтары прызналі для карпаратыўных і асабістых інтарэсаў "ў падвешаным стане.

Схема з'яўляецца функцыянальным мовай падоўжаны на саступкі і I / O. Мы пратэставалі MIT Схема версіі прадстаўлены ў табліцы 1, абодва з якіх з'яўляюцца чыста перакладчыкаў лічачы дату з 1993 года. Мы спрабавалі гэта некалькі Схема кампілятары даступныя ў Інтэрнэце, у тым ліку scheme48, Сталін, VSCM, і Edscheme, мэта кожнай няўдалай для запуску адной з Наша тэставая праграма даступная быў не залаты для ўсіх нашых вылічальных платформаў. (Гл. [Клінгер 97] Схема для атрымання дадатковай параўнання.)

Улічваючы больш часу і энергіі, можна было б тэст моў сцэнарыяў, як іншыя абалонкі Unix, Python і REXX, функцыянальных моў, такіх як SML, і інтэрфейс патэнцыялу моў, такіх як Delphi.

Выбар машыны

O Мы правялі тэсты на тры машыны:

*
100 МГц MIPS R4000 SGI Indy, IRIX 5,3
*
50 МГц Sun SPARCstation-10, Solaris 2,5 (SunOS 5,5)
*
Pentium 100 MHz (32Mb Micron тысячагоддзяў Stealth64 Diamond 2001 відэа), Windows 95. Гэта PC-відаць, ідэнтычная той, якая выкарыстоўваецца для тэставання ў [Бут 97].


Хоць пажылыя людзі, машыны вельмі падобныя дысертацыю ў хуткасці. Для нас, яны прапанавалі яшчэ тое перавага, што мы маглі б выратавальнае ніхто больш не будзе выкарыстоўвацца падчас ет аб тэстаў, якія выдаленыя адзін крыніца зменлівасці. Мы маглі б запускаць кожны тэст Кожная сістэма, за выключэннем Visual Basic, які збег толькі па выходных на ПК, і Java, для якога ў нас не было рэалізацыі Irix. Калі не пазначана іншае, мы выкарыстоўвалі тыя ж рэалізацыі ўсёй сістэмы.

Тэрміны збору статыстыкі

Цяжкасці вымярэння праграма Час аўтаномнай працы надзейна і прайграваны добра вядомая. Мы сутыкнуліся наступныя бар'еры, у прыватнасці:

- Стаць больш непрадказальнымі выканання вымярэнняў з падзелам часу машына становіцца больш актыўна выкарыстоўваецца. Нават адно-кампутарах карыстальнікаў, сістэмныя працэсы канадскіх Вясна ў дзейнасці ў сярэдзіне тэсту, мы Час аўтаномнай працы з непрадказальнымі наступствамі. Працэс таймінгаў сумна вядомыя сваёй ненадзейнасць кампутара з'яўляюцца, асабліва для невялікіх накладаў, яны нічым не лепш мэты на сістэмах Unix. раз Насценныя гадзіны можа быць значна больш, чым сума сістэмных і карыстацкіх раз, падзея мы, мабыць, спакою сістэмы.
- I / O Times можа ўвесці ў зман дрэнна, калі кампутар знаходзіцца далёка ад файла, With've сеткавых файлавых сістэмах. Час для графічных аперацый могуць ўводзіць у зман дрэнна, калі дысплей з аддаленага кампутара, як і тэрміналы X.
- Некаторыя праграмы працаваць хутчэй, тым часцей яны працуюць, калі яны лепш з атрымаеце практыцы. Часам гэта звязана з кэшаваннем, напрыклад, ёсць праграмы, які счытвае вялікі файл можа працаваць хутчэй на другога і наступных Паколькі праграма працуе і чэргі ўжо ў памяці.
- Некалькі праграм зойме шмат часу для запуску больш яны часта выконваюцца. Мы падазраем, што той звязаны з павелічэнне часу выканання праблемы кіравання памяццю.

Час для C, AWK, Perl і Tcl Ці сума `` карыстальніка time''and `` сістэмы time''Reported Да таго часу камандуючы Unix, ці агульны час Адзначаныя Па Інструментарый каманды МКС часу на Windows 95. Мальтус, дысертацыі ўключае ў сябе час спасылацца на мове працэсара (для Awk, Perl, і Tcl) або загружаць і запускаць праграму (C), а таксама "чытаць, працэсу і выкананне праграмы.

Час для Java, Visual Basic і Limbo вылічаецца па унутраным таймерам праграмы, такія, як дата ў Java і таймера ў VB. Дысертацыя выключыць ўвесь час запуску, да некалькіх суму, якая Canon секунд. Напрыклад, інтэрпрэтатар Java экспанатаў прыкметная затрымка запуску, з Меркавана распакаванне файлаў стандартнага класа.

Тэрміны Схема Праграмы пастаўленых задач. Функцыі ўнутранага часу ў схеме выканання MIT, прырост капіталу адтэрміновак толькі свабодна, што карэлявалі з сцены гадзіны. (Час выканання функцыі З'яўленне ў схеме стандартны тэкст [Абельсон 96], хоць ён не згадваецца ў спасылкі схема [схема 91].) Мы Irix і Windows, выканання выгады адтэрміновак, якія з'яўляюцца занадта нізкімі ад 10 да 25 адсоткаў. Мы Solaris выканання справаздач Times, якія занадта высокія ад 30 да 65 адсоткаў. Такім чынам, мы выкарыстоўвалі секундамер для запісу раз схема. Схема Перакладчык раз aussi выключыць час запуску.

Сабраць таймінгаў, кожны з нас тэст бег некалькі разоў, як правіла, з пятлёй, як гэта:

	for i in 1 2 3 4 5 6 7 8 9 10
	  do time commandline
	done
Мы адкінуць першы раз, каб кампенсаваць (часткова) для кэшаваньня. Калі БЫЎ выканання больш чым за хвіліну ці каля таго, мы тэст пабег Звычайна толькі 2 ці 3 разы: калі адна версія Праграма працуе ў некалькіх "секунд, прымае Іншая мэта хвілін, Там няма падстаў выправіць" Апошняе час з завастрыць дакладнасць. Вымяраецца ў секундах для разы, у выхадныя звычайна паміж 5 і 10 рандомизированных даследаванняў. Нататкі графаў растлумачыць незвычайныя сітуацыі, такія як шырокі зменлівасці асяроддзя выканання.

2 тэсту з асноўных функцый,

Першае практыкаванне тэставанне асноўных асаблівасцяў мовы, як арыфметыка, завесы і выклікі функцый.

Завесы і арыфметычныя

Спачатку выпрабаванні Ажыццяўленне завесы накладныя выдаткі шляхам падліку Механізмы п. Выкарыстаньне вялікіх значэнняў п Дапамагае знізіць узровень шуму ў вымярэння часу. Праверка, лінейнай асяроддзя ў кошт не дапаможа выявіць Амбіцыйныя аптымізатараў (гл. ніжэй).

Праграмы ў большасці моў выглядаць. Напрыклад, вось версія C:

int i, n = atoi(argv[1]), sum = 0;
for (i = 0; i < n; i++)
	sum++;
І версія Tcl:
set sum 0
set n [lindex $argv 0]
for {set i 0} {$i < $n} {incr i} {
	incr sum
}
Мы прымеркаваны наступнай схеме версію праграмы, у якой звычайныя ІКТ ў выкарыстанні хваставой рэкурсіі для ажыццяўлення цыкла, мэта незвычайнага ў выкарыстанні set!змяніць глабальную зменную неаднаразова:
(define sum 0)
(define (tail-rec-aux i n)
	(if (< i n)
		(begin (set! sum (+ sum 1)) (tail-rec-aux (+ i 1) n))
		sum))
(define (tail-rec-loop n)
	(tail-rec-aux 0 n))
Альтэрнатыўны варыянт, які праходзіць аргументы тры tail-rec-aux and only uses set!ў канцы рэкурсіі працуе каля пяці адсоткаў хутчэй.

Для нереконструированная неабходна стылі праграмістаў, схема вызначае ітэрацыі пабудаваць (do),, З якой завесы вышэй, могуць быць запісаны наступным чынам:

(define sum 0)
(define (do-loop n)
	(do ((i 0 (+ i 1)))
		((>= i n) sum)
		(set! sum (+ sum 1))))
З MIT Scheme, часу аўтаномнай працы для гэтай версіі гэтак жа, як для хваставой рэкурсіі версіі. З Edscheme, камерцыйная рэалізацыя ПК, doВерсія бег ўдвая хутчэй, чым хваставой рэкурсіі форме. Мы не маглі б зрабіць больш эксперыментаў з Edscheme з нашай ацэнцы копіі мінуў, перш чым мы скончылі нашы тэсты.


Basic loop test

Гэты графік мае некалькі асаблівасцяў, якія з'яўляюцца агульнымі для ўсіх графікаў у дадзенай працы. Колькасць вылічальнай працы з'яўляецца на гарызантальнай восі і выканання адлюстроўваецца на вертыкальнай восі. Абедзве восі пабудаваныя ў лагарыфмічнай маштабе, што дазваляе адлюстроўваць шырокі дыяпазон значэнняў дадзеных. Было б зручна выбраць ўваходныя памеры, якія даюць разумныя асяроддзя выканання, у ідэале каля 10 секунд, але гэты ідэал не можа быць дасягнута пры Час аўтаномнай працы для розных моў на чатыры парадку адзін ад аднаго.

Мы распрацавалі выпрабаванні якога асяроддзя павінна расці лінейна з памерам праблема: асяроддзе = M ? памеру B +. Такім чынам, калі выбраць памер, каб быць дастаткова вялікім, каб апраўдаць ігнараванне пастаянных накладных (б), лагарыфмічнай маштабе павінна паказаць прамой адзінкавым нахілам. Выключэнні паказваюць, што анамальная паводзіны заслугоўвае далейшага ўвагі.

Напрыклад, на Windows 95 лінія, якая злучае C Час аўтаномнай працы з'яўляецца абсалютна гарызантальна. У самой справе, час выканання працягвае быць пастаяннай пры n = 10^7 and n = 10^8. Гэта адбываецца таму, што аптымізатар выключае ўсёй завесы, замяніўшы яго sum = n.Пры аптымізацыі адключаны, раз на Windows 95 растуць вельмі павольна n, from 0.25 seconds at n = 125,000 to 0.33 seconds at n = 10^6.

Графа для Windows 95 таксама ясна паказвае перавага, што Java і Visual Basic карыстацца, таму што нашы таймінгаў не бярэм іх для запуску.

Карціна ў гэтых графах з'яўляецца ў многіх вынікаў выпрабаванняў. Складальнік машынны код (C) працуе хутка, а побач хутка інтэрпрэтуюцца байт-код (Java, Limbo, Visual Basic); Далей ідуць перакладчыкаў, што пабудаваць і выканаць ўнутранае прадстаўленне, як абстрактнае сінтаксічныя дрэва (Awk, Perl); павольны з усё перакладчыкі, што неаднаразова сканавання арыгінальнага крыніцы (схема, Tcl). Паміж кожнай парай паслядоўных этапаў ёсць у 5-10 раз розніца ў рэжыме выканання, з агульнага дыяпазону, што перавышае на тры парадку.

Выклікі функцый

Наступная праграма вылічае функцыю Акермана. Вылічальны ACK ( 3 , Да) = 2 ^ (Да + 3) - 3 патрабуе, па меншай меры, 4 ^ (Да + 1) выклікае функцыю, і дасягае рэкурсіўных глыбіні 2 ^ (Да + 3) - 1, так што гэты тэст дае механізм выкліку функцыі дбайнай трэніроўкі. Код атрымліваецца падобным на большасць моў, пры гэтым ён знаходзіцца ў C і Java:

int ack(int m, int n) {
	if (m == 0)
		return n+1;
	else if (n == 0)
		return ack(m-1, 1);
	else
		return ack(m-1, ack(m, n-1));
}



і на схеме:
(define (ack m n)
   (cond ((= m 0) (+ n 1))
      ((= n 0) (ack (- m 1) 1))
      (else (ack (- m 1) (ack m (- n 1))))))


Функцыя Акермана выпрабаванні: ack(3,k)

У Windows 95, мы забілі Perl ACK вылічальная праграма ( 3 , 8 ) Пасля гадзіны не відавочны прагрэс. На Irix, Perl 5,004 перапыненая без паведамленняў аб ACK ( 3 , 8 ); Perl 5,001 прынялі 350 секунд, каб вылічыць правільны адказ.
Па змаўчанні, Tcl мноства maxNestingDepth ў стэку да 1000. Для нашых тэстаў мы павялічылі гэты мяжа да 5000 і перакампіляваць Tcl на Irix і Solaris (але не на Windows 95). Нават пры гэтым верхняя мяжа, аднак, Tcl перапаўненне пры вылічэнні ACK ( 3 , 8 ), Так як кіраўнікі структуры і выразы адзнак, а таксама выклікі працэдур, якія патрабуюць рэкурсіўных выкліку перакладчыка Tcl.

Для вялікая праблема памеру (K = 8), парадак моў за кошт павелічэння часу выканання застаецца аднолькавым ва ўсіх трох сістэмах. (Асноўны тэст завесы вынікі таксама паказалі межсистемные паслядоўнасці, але з тых мовах, на іншым парадку.) Тут, схема і Awk бег хутчэй, чым Perl, і Limbo бег хутчэй, чым Visual Basic. Такія агульнай ўзгодненасці паміж сістэмамі рэдка.

3 масівы і радкі

Усе гэтыя мовы забяспечваюць багатыя масівы і радкі, чым у C, у тым ліку, магчыма, асацыятыўныя масівы, дынамічныя масівы, кіравання захоўваннем дадзеных для струнных, і збор смецця. У гэтым раздзеле даследуюцца некаторыя іх ўласцівасці.

Індэксавацца масівы

Першая праграма выкарыстоўвае масівы як калі б яны былі праіндэксаваныя. Яна ўсталёўвае N элементаў масіва цэлалікавых значэнняў, то копіі масіва ў іншы масіў, пачынаючы з індэксам N-1. Вось код на З, Awk, Java, і Limbo, напрыклад:

for (i = 0; i < n; i++)
	x[i] = i;
for (j = n-1; j >= 0; j--)
	y[j] = x[j];


Indexed array test

Схема выпрабаванні не ўдалося спыніць на ўсе тры сістэмы, калі масіў быў занадта доўга.

Гэта выпрабаванне аказалася складаней, чым мы чакалі. Мовы, якія прапануюць толькі асацыятыўныя масівы (як Awk і Tcl) звычайна выкарыстоўваюць хэш-табліц для рэалізацыі простага індэксавання ``''неабходныя для гэтага прыкладу. Гэтым тлумачыцца іх вялікае час аўтаномнай працы. Сапраўды, перапісаўшы Perl праграме выкарыстоўваць асацыятыўныя масівы замест індэксавацца масіваў троек яе выканання на Unix, і пяцёрак яе на Windows 95.

На ПК (з 32 Мб памяці) Awk і Tcl трэш дрэнна, калі N = 200000, з Час аўтаномнай працы каля каля 450S (Awk) і 170S (Tcl).

Радкамі

Наступны тэст практыкаванні некалькі аперацый радкі: даўжыня вылічальных радок, канкатэнацыі радкоў, і здабывання падрадка. Праграма будуе радкоў, каб пазбегнуць якіх-I / O час, чытаючы іх з файла. Вось версія Awk:

for (j = 0; j < 10; j++) {
	s = "abcdef"
	while (length(s) <= n) {
		s = "123" s "456" s "789"
		s = substr(s, length(s)/2) substr(s, 1, length(s)/2)
	}
}
Гэтая праграма вылічае даўжыню S двойчы другое прызначэнне ў гэты час цыклу. Версія, што захоўвае даўжыню ў часавай зменнай працуе толькі каля пяці адсоткаў хутчэй, таму мы тэставалі просты версіі паказана вышэй.

Праграма C, з другога боку, адсочвае працягласць вегетацыйнага радкі:

int j, len, n = atoi(argv[1]);
char *s = NULL, *p;

for (j = 0; j < 10; j++) {
	free(s);
	s = strdup("abcdef");
	while ((len = strlen(s)) <= n) {
		p = (char *) malloc(2 * len + 10);
		sprintf(p, "123%s456%s789", s, s);
		free(s);
		s = p;
		len = strlen(s);
		p = (char *) malloc(len + 2);
		strcpy(p, s + len/2);
		strncat(p + len/2, s, len/2+1);
		free(s);
		s = p;
	}
}
На машынах Unix, версія, якая не захоўвае Лена працуе каля 40% павольней, чым праграмы паказана вышэй. Але на Windows 95, версія, якая не выкарыстоўвае даўжыня складае ўсяго каля пяці адсоткаў павольней.


String test

Схема Час аўтаномнай працы для гэтага тэсту, незвычайна хутка, але схема не ўдалося спыніць, калі радок S стаў занадта доўга.

C Час аўтаномнай працы вельмі адчувальныя да Падрабязная інфармацыя аб праграме: яны хутчэй меншае колькасць разоў радок пройдзены ад пачатку да канца (як у StrLen, зЬгсру, і strcat). Графікі паказваюць, што Awk, Tcl, Java і ўяўляюць радкі як нулём паслядоўнасці байтаў, але і Perl Limbo ўключаюць інфармацыі аб даўжыні радка ў іх структурах дадзеных.

Гэты тэст таксама ажыццяўляе захоўванне размеркавальнік. Відавочна версія C бібліятэкі, на якой як Awk і Tcl спадзявацца, ідзе павольна. Perl могуць атрымаць выгаду ад правядзення сваёй ўласнай версіі Malloc.

Асацыятыўных структур дадзеных

Некаторыя з гэтых моў прапаноўваюць убудаваныя аб'екты (рознаму называюцца асацыятыўныя масівы, хэш-табліц або хэшы), якія можна выкарыстоўваць для сувязі значэння з кнопкі, так што пошук можна выканаць за пастаяннае час. Наша тэставая праграма сінтэзуе ключавыя значэння з нумара, каб пазбегнуць выканання любых I / O. Для таго, каб ажыццяўляць як пошук, што поспех і пошуку, якія не, праграма захоўвае ключы, створаныя з нумарамі ад 1 да N выглядзе шаснаццатковай радкі, але спрабуе атрымаць ключы з дапамогай лічбаў ад 1 да N выяўляецца ў выглядзе дзесятковай радка. Праграмы ў Perl з'яўляецца

for ($i = 1; $i <= $n; $i++) {
  $X{sprintf('%x', $i)} = $i;
}
for ($i = $n; $i > 0; $i--) {
  if (defined $X{$i}) {
	$c++;
  }
}
and in Tcl
for {set i 1} {$i <= $n} {incr i} {
	set x([format "%x" $i]) $i
}
set c 0
for {set i $n} {$i > 0} {incr i -1} {
	if {[info exists x($i)]} {
		incr c
	}
}


Associative array test

Мовы не паказана не забяспечваюць убудаваныя ў асацыятыўныя масівы. Схема мае ўбудаваны ў асацыяцыі спісы, але іх лінейным часам доступу абавязаныя зрабіць іх працу параўнаць неспрыяльна з хэш-табліц.

прадукцыйнасць Java на гэтай задачы на ??здзіўленне бедным. Спачатку мы думалі, што Hashtable клас, выкарыстоўваны бедных хэш-функцыі. Але для выканання выпрабаванняў павялічваецца, калі яно паўтараецца, што дазваляе выказаць здагадку, што могуць быць праблемы з кіраваннем памяццю.

4 ўваходу / выхаду

Тэсты ў папярэдніх раздзелах вымераная хуткасць сыравіны вылічэнняў і кіравання памяццю. У адрозненне ад праграмы ў гэтым раздзеле ўзаемадзейнічаць з навакольным светам, чытанне некаторых значны аб'ём дадзеных, робіць некаторыя вылічэнні на кожнага элемента дадзеных, або выказаць нейкія выхад. Гэтыя аперацыі з'яўляюцца тыповымі для Awk і Perl, хоць, магчыма, не за аб'ёмы дадзеных, якія выкарыстоўваюцца тут, у гэтым сэнсе выпрабаванняў не можа быць `` справядлівай,''але павінна быць некалькі Droit d'Auteur.

Уваходнага набору даных на працягу першых трох задач з'яўляецца вытворным ад Бібліі караля Джэймса. Уся Біблія змяшчае 31102 радкоў (адзін верш у радку), 851820 слоў, і 4460056 знакаў. Мы таксама выкарысталі першае паўгоддзе, квартал, і восьмы ў Бібліі ў якасці ўваходных даных для многіх выпрабаванняў.

Капіраванне файлаў

Першая задача заключаецца ў капіяванні на ўваходзе і выхадзе, неинтерпретированных і недаследаваных, як каманда котка Unix. Два іншых I / O тэсты ўключаюць у сябе па крайняй меры ўваход паловы гэтай аперацыі.

У Awk, Perl, Tcl, Visual Basic і Limbo, натуральна, каб напісаць праграму для працы адной лініі на час. Напрыклад, вось Awk, Perl, Tcl і версій:

{ print }	# Awk

while (<>) {	# Perl
  print $_;
}

while {[gets stdin line] >= 0} {	# Tcl
	puts $line
}
У C, Java, і схема, аднак, натуральна, каб напісаць праграму для працы па адным знаку за раз. Вось версія C, якая выкарыстоўвае stdio:
main(int argc, char *argv[]) {
	int c;
	FILE *fp = stdin;

	if (argc > 1)
		fp = fopen(argv[1], "r");
	while ((c = getc(fp)) != EOF)
		putc(c, stdout);
}


File copy test

Графікі паказваюць, што праграмы, якія працуюць на ўзроўні ліній звычайна працуюць хутчэй, чым праграмы, якія працуюць на ўзроўні знакаў. Вядома, лінія-у-часу праграмы могуць быць ўвядзенне абмежаванняў на даўжыню радка, якія не выявілі з дапамогай Бібліі караля Джэймса ў якасці ўваходных дадзеных. (Самы доўгі верш Эстэр 8:9, з 92 слоў і 529 сімвалаў).

Такім чынам, графікі пацвярджаюць агульнапрынятую пункт гледжання, што выбар `` кусок''размер, на якім працуе праграма важная для яго працы. Сапраўды, мы можам падвоіць хуткасць працы праграмы на Perl Irix, змяніўшы яго наступным чынам свой уклад у адзін кавалак. З іншага боку, змяненне Tcl праграмы па Irix чытаць свой уклад ўсё адразу робіць яго запусціць прыкладна ў шэсць разоў больш павольна.

Нашы тэсты таксама паказваюць важнасць ўводу / вываду буферызацыі.

Unix сістэмы няяўна буфер ўводу / вываду, якія былі перанакіраваны з або ў файлы, але гэта не было перанесенае на Windows 95. Гэта азначала, што нашы арыгінальныя праграмы Tcl буфер сваю прадукцыю адной лініі за адзін раз, і пабег амаль у 20 разоў павольней, чым версія аб чым гаварылася вышэй. Мы змянілі яго канкрэтнымі просьбамі поўнай буферызацыяй на стандартны вывад.

Java пояс для праграмы, якая выкарыстоўвае клас BufferedInputStream. Выкарыстаньне небуферизованных класы для ўводу / вываду павялічвае час выканання па меншай меры на 50%. Нават з буферызацыяй, Java праграм панесці вялікія выканання таму ўводу / вываду метады інтэрпрэтуюцца, не збіраюцца. JDK1.1 версію Java таксама накладвае некаторыя накладныя выдаткі, звязаныя з храналогіяй некалькіх патокаў [Гослінг 97].

Час аўтаномнай працы велізарныя Схема па ўсёй бачнасці, выклікана адсутнасцю магчымасцяў для буферны ўваход і выхад. Мы напісалі праграму на З, які чытае і запісвае адзін байт у той час, і яна займае нават больш часу, чым праграма на Схеме, так рэалізацыі Схемы могуць быць буферызацыя глыбока ўнутры.

Падлік слоў

Другі тэст заключаецца ў падліку радкоў, слоў і сімвалаў ва ўваходным, як і ў Unix туалет праграмы. Гэтая хуткасць выпрабаванні ўваход і магчымасць для аналізу ліній на больш дробныя адзінкі. Ёсць па крайняй меры два асноўных падыходу. У Awk, Perl і Tcl, прыродных праграма чытае кожную радок і разбівае яе на палі ``,'', кожная з якіх адпавядае слова. Вось wc in Awk:

  { nl++; nw += NF; nc += length($0) + 1 }
END { print nl, nw, nc }



У C, Java, Visual Basic, Limbo, і схема, прыродных праграма счытвае ўвод аднаго знака на час і выкарыстоўвае дзяржаўную машыну для падліку пераходаў у і з слоў. Вось версія Java:
int nl = 0, nw = 0, nc = 0;
int b;
boolean inword = false;
while ((b = System.in.read()) > -1) {
	++nc;
	if (b == '\n')
		++nl;
	if (Character.isSpace((char)b))
		inword = false;
	else if (inword == false) {
		++nw;
		inword = true;
	}
}
Мы прымеркаваны версія Схема гэтай праграмы, якія ўсталёўваюць! З трох глабальных зменных для выканання гэтай задачы. Хваставой рэкурсіі версія, што праходзіць у гэтыя зменныя ў якасці параметраў, магчыма, больш тыповая схема стыль, бегалі пяць адсоткаў павольней.


Word count test

Графаў пацвердзіць важнасць `` памеру кусок''упоминалось вышэй для коткі. Звярніце ўвагу, што значна горш, Visual Basic і Limbo тарыф, калі яны працуюць на асобныя сімвалы, а не лініі.

Паколькі туалет робіць больш вылічэнняў на ўваходзе, чым коткі, мы чакалі, што гэта ёсць больш час аўтаномнай працы. Каля паловы часу, ён робіць. Але Існуюць таксама месцы, дзе туалет хутчэй, чым коткі, у тым ліку Tcl на Windows 95, і Java з абодвух Solaris і Windows 95, можа быць, гэта таму, што выхад туалет толькі адна лінія, значна менш, чым выхад з кот.

Рэверсіўныя файл

Наступны тэст, каб прачытаць ўвесь дакумент у масіў, а затым раздрукаваць лініі ў зваротным парадку. Гэты тэст правярае здольнасць будаваць і доступ вельмі вялікі масіў. Версія Awk з'яўляецца

{ x[NR] = $0 }
END { for (i = NR; i >= 1; i--)
	print x[i]
}
Версія Perl чытае ўвесь файл у масіў з адным заявай:
@a = <>;
for ($i = $#a; $i >= 0; $i--) {
  print $a[$i];
}
У адрозненне ад каманды хвост Unix-R, C нашай рэалізацыя не шукаць з канца файла, але чытае ўклад у масіве.


Файл развароту тэст

Версія Схема спыняецца з `` з памяти''сообщение на кожнай сістэме, пры спробе зваротнага першым квартале Бібліі.

Парадак моў выканання такой жа, ва ўсіх трох сістэм. Слова падліку задача таксама выстаўленыя крыжаванай сістэмы ўзгаднення, але мовы з'явіліся ў іншым парадку.

сума

Наступны тэст практыкаванні ўваход, лічбавы пераўтварэнні, і арыфметыка. Праграмы чытаюць 100000 лікаў з плаваючай кропкай, як гэта

  513.871
 -175.726
  308.634
 ...
з файла і вылічыць іх суму. Гэтая праграма лёгкая ў Awk:
{ s += $1 }
END { print s }
і не нашмат складаней у іншых мовах.


Sum test

Парадак моў выканання супастаўна з для таго, каб слова рахункі, за выключэннем Tcl (які атрымаў павольней) і Visual Basic (які атрымаў хутчэй). На самай справе, наша арыгінальная праграма Tcl бег хутчэй, але вылічыць розныя сумы, чым любы з іншых праграм; таймінгі прыведзеныя для Tcl праграма, якая відавочна задае tcl_precision да 17 гадоў.

5 Графічны інтэрфейс карыстальніка Тэсты

Ёсць два асноўных кампанентаў карыстацкіх інтэрфейсаў, дзе хуткасць галоўнае: працы з тэкстам у `` тэкставы віджэт,''і малявання графічных аб'ектаў, такіх як лініі, прастакутнікі і колы. Вядома, такія аперацыі, як павышэнне дыялогавых вокнаў або знос пунктаў меню павінна адбыцца хутка, але іх асяроддзе не мае вялікага значэння для агульнай прадукцыйнасці.

Тэкст Тэсты

Тэкст тэст дадае N кароткія лініі на полі, па аднаму за раз, і прычыны апошняй радку будзе адлюстроўвацца кожны раз. Завесы Tcl выглядае наступным чынам:

for {set i 1} {$i <= $n} {incr i} {
	.t insert end "$i\n"
	.t see end
	update
}
Версія Limbo з'яўляецца прамой транслітарацыі:
for (i := 1; i <= n; i++) {
	tk->cmd(t, ".t insert end " + string i + "\n");
	tk->cmd(t, ".t see end");
	tk->cmd(t, "update");
}
У Visual Basic, гэта
For i = 1 To n
  bigtext.Text = bigtext.Text & CStr(i) & crlf
  bigtext.SelStart = Len(bigtext.Text)
  bigtext.SelLength = 0
  DoEvents
Next i
і ў Java
for (int i = 1; i <= n; i++) {
	bigtext.appendText(i + "\n");
	Toolkit.getDefaultToolkit().sync();
}


Устаўка тэст

Мы відавочна прасіў абнаўлення экрана пасля кожнай ўстаўкі, акрамя як у Visual Basic. Апускаючы гэтых абавязковых аднаўленьняў зводзіцца Час аўтаномнай працы істотна, таму што змены ў экспазіцыю ўвайшлі буфер так, што толькі канчатковы вынік бачны. Час аўтаномнай працы для гэтага выпрабаванні яшчэ менш надзейным, чым у папярэдніх тэстах, паколькі дысплей на сістэмах Unix кіруе сервер X, які дадае сваю ўласную раз у сумесі. Мы выкарысталі секундамер для Limbo на Unix, дзе паведамілі, раз не былі звязаныя з назіраным раз.

Visual Basic не мае метад для дадання тэксту ў TextBox, таму стварэнне кожнага новага дысплея, здавалася б квадратычным працэсу. Нягледзячы на ??гэта, Visual Basic Час аўтаномнай працы з'яўляюцца цалкам разумнымі. Экран міргае і запавольвае дысплей, відаць, таму Visual Basic паўторна адлюстроўвае першую радок пасля кожнай ўстаўкі. Visual Basic прапануе альтэрнатыўныя RichTextBox, які мае больш магчымасцяў (памер, шрыфт, колер), а таксама пераадольвае 32000 знакаў рэгулярнага TextBox. Тое ж абследаванне зойме каля 30 адсоткаў больш з RichTextBox.

Маляванне Тэсты

Іншых буйных часу дзейнасці для карыстацкіх інтэрфейсаў малюе графічныя аб'екты. Вымераючы час, якое патрабуецца звярнуць п ліній у вентылятар, кожны з невялікай каляровы круг у рэшце рэшт, мы спадзяемся захапіць толькі самыя асноўныя паводзінаў. Мы не спрабавалі ажывіць сцэну, перамяшчаць любыя аб'екты, ці ўзаемадзейнічаць з імі пасля таго як яны былі зробленыя.

Версія Java з'яўляецца прадстаўніком:

for (int i = 1; i <= lim; i++) {
	g.setColor(Color.blue);
	g.drawLine(MINX, MINY, MAXX, MINY + (int) (i * dy));
	g.setColor(Color.black);
	g.fillOval(MAXX, MINY + (int) (i * dy), d, d);
	g.setColor(Color.red);
	g.drawOval(MAXX+2, MINY + (int) (i * dy)+2, d-4, d-4);
}


Лінія / акружнасці малюнак тэст

Абмежаванні памяці прадухіліць тэсціравання Limbo для павелічэння уваходнага памеры Solaris і Windows, дзе больш ранняй версіі сістэмы выкарыстоўваецца. У некаторых выпадках, Limbo раз па ўсёй бачнасці, павелічэнне часцей тэсту.

Гэтыя часы найменш надзейныя, бо кожная адлюстроўвае праектных рашэнняў у рэалізацыі адпаведнай сістэмы. Раз паведамілі ўнутраных таймераў ў праграмы ніжняя мяжа на тое, што бачыць карыстальнік, у нас не ўключаны любыя дадатковыя затрымкі, што адбываецца да экрана абнаўляецца.

Час аўтаномнай працы значна ўзрасце ў выпадку відавочнага абнаўлення дададзены пасля кожнай аперацыі малявання, так як яны могуць быць у некаторых відах анімацыі. Java і Visual Basic па ўсёй бачнасці, абнаўленне экрана бесперапынна, нават калі гэта паводзіны не прасіў. ТЗ і Limbo абнаўлення адключаныя і альбо адбудзецца, усё адразу (ТЗ), або спарадычна (Limbo).

У цэлым, графіка аб'екты істотна адрозніваюцца, нашы выпрабаванні засяродзіцца на элементарных задач. Віджэт палатна ТЗ (праз Tcl або Limbo) значна багацей і больш гнуткім, чым тое, што даступна ў Java або Visual Basic, але гэты тэст не ажыццяўляць гэтыя магчымасці на ўсіх.

6 кампіляцыя ад інтэрпрэтацыі

У простыя часы, `` сборник''означает пераклад з зыходнага кода з дапамогай асэмблера ў машынны інструкцыі. Праграма была складзена раз, магчыма, з крыху аптымізацыі, і ў выніку выкананы файл малюнка, які ніколі не змяніліся. Сёння, `` сборник''является больш складаным.

Мовы сцэнарыяў прапануюць некалькі прамежкавых пазіцый, з некалькі значэнняў нават для `` интерпретации''Tcl 7,6 і 7,3 Схема чыста перакладчыкаў, якія неаднаразова аналізу зыходнага кода, як яны бягуць;. Гэта вельмі гнуткі, але самы павольны з усіх, як графы вышэй ясна паказваюць. Awk перакладае сваю праграму ў дрэва, які ішоў пад час выканання, Visual Basic стварае ўнутранае прадстаўленне р-кода, і Java і Limbo пераклад у байт-коды для віртуальных машын (яшчэ адна форма р-код). Такая папярэдняя апрацоўка дазваляе паскарэнняў намаляваныя на графіках ніжэй.

У кожным выпадку, можна ўзяць працэс ішоў далей, альбо шляхам перакладу арыгінальнай праграмы ў нешта хутчэй, як C або C + +, або шляхам кампіляцыі байт-код у машынныя каманды, альбо да выканання або па патрабаванні падчас выканання (`` толькі ў час кампіляцыі''). Графаў ніжэй паказаны вынікі некаторых эксперыментаў з `` сборник''средств, якія прадстаўляюцца некалькімі з гэтых моў:

-
Awk на C + + перакладчык апісана ў [Керниган 91] вырабляе C + +, якія мы сабралі з Visual C + +.
-
Tcl 8.0b2 кампілюецца ва ўнутраны байт-код.
-
Клас файлы, створаныя Visual J + +, выконваюцца з's JView Microsoft, якія мы лічым як раз у момант кампілятарам. Параўнанне з JDK1.1 перакладчыка Sun.
-
Visual Basic 5.0 ўключае ў сябе ў асноўным рэжыме кампілятара. Параўнанне з Visual Basic 4.0.
-
Limbo мае сапраўды ў кампілятар часу аналагічныя для Java.
-
VSCM [Блюм 94] ўяўляе сабой кампактны, партатыўны ажыццяўлення з выкарыстаннем віртуальнай машыны напісаны на C і байт-код кампілятар, напісаны ў самай схемы.


Графікі паказваюць стаўленне складзены выканання, каб інтэрпрэтаваць выканання. Для гэтага эксперыменту, мы правялі выпрабаванні толькі на ПК, дзе мы найбольш даступных моў. Мы толькі стараемся найбуйнейшых рэсурсаў, якія выкарыстоўваюцца раней, для змяншэння ўкладу запуску на час выканання вымярэнняў.


Складальнік часу / інтэрпрэтаваць час, па мове

Выкід тут час Java для асацыятыўнага масіва выпрабаванні. Мы лічым, што праблема з захоўваннем кіравання.
Некаторыя Схема выпрабаванні апушчаны, таму што яны пачаліся непрыемнасці: адмова для разбору ўваходных або бясконцы цыкл. На яркай баку, раз вяртаецца VSCM вельмі дакладныя.


Складальнік часу / інтэрпрэтаваць час, задача

Гэтыя графікі паказваюць шэраг цікавых фактаў. Кампіляцыя звычайна, але не заўсёды, зніжае час выканання, а ў некаторых выпадках ён зрабіў прадукцыйнасць значна горш. Большасць паляпшэнняў з'яўляюцца сціплымі, а некаторыя мовы (напрыклад Limbo) маюць вялікі дыяпазон паляпшэнне, у той час як іншыя (напрыклад, Visual Basic) назіраецца толькі ў вузкім дыяпазоне. Не дзіўна, што найбуйнейшыя паляпшэнняў для простай мова featuresthose большасць як звычайныя мовы праграмавання, такім чынам, асноўныя выпрабаванні завесы і функцыі Акермана палепшыць большасць, а I / O выпрабаванняў палепшыць меры (калі сістэма ўводу / вываду таксама закадаванай у мове у пытанне, як гэта з Limbo і, здаецца, з Java).

7 Абмеркаванне і высновы

Ясна адно можа выконваць мноства іншых эксперыментаў, напрыклад, для запаўнення ў больш моўныя асаблівасці на больш сістэматычнай аснове, для расследавання рэгулярных выразаў (у Awk, Perl і Tcl) або радок пошуку (у Java і Visual Basic), або для вывучэння больш карыстацкі інтэрфейс кампанентаў.

Іншы магчымасцю было б параўнаць рэалізацый аднаго і таго ж інструмента, паколькі некаторыя з гэтых моў даступныя ў розных рэалізацыях. Напрыклад, можна было б вымяраць Awk, Gawk, Mawk і (на Windows 95) МКС Awk. Ёсць шмат рэалізацый Java, засяроджаныя ў асноўным на Windows. На жаль, гэтыя як правіла, працуюць толькі ўнутры браўзэра, дзе абмежаванні бяспекі не дазваляюць зрабіць ўводу / вываду выпрабаванняў.

Некаторыя з I / O Runtimes дзіўна доўга. Апублікавана крытэраў рэдка ўключаюць I / O выпрабаванняў. Магчыма, калі б яны зрабілі, мова рэалізацыі будзе працаваць лепш, чым яны.

Колькасць рэальнай памяці робіць вялікі розніцы ў камп'ютэрных прыкладанняў; раз праграма пачынаецца падпампоўкі, Час аўтаномнай працы стаў доўга і непрадказальна. Гэта адбылося з (па крайняй меры) Awk, Perl і Tcl. Абнаўленне нашых ПК ад 16MB да 32MB паскорыла некалькіх выпрабаванняў у два разы або больш. (Усе вынікі тут для 32Mb).

Кіраванне памяццю таксама мае значэнне. Здаецца відавочным, што некаторыя з нашых тэстаў паўсталі праблемы з ажыццяўленнем збору смецця. Звычайны сімптом Час аўтаномнай працы, што павелічэнне ў ходзе серыі выпрабаванняў. Іншымі фактарамі з'яўляюцца проста па-за кантролю, і, магчыма, нават за межамі пазнання. Сучасныя машыны выкарыстоўваюць некалькі узроўняў кэш-памяці, каб павольна асноўнай памяці па ўсёй бачнасці, працуюць амаль з хуткасцю кэш-памяці, але розныя працэсары (усе з той жа намінальным хуткасці) маюць розную колькасць і віды кэш-памяці.

Абмежаванні гэтыя вынікі маюць важнае значэнне і нясуць паўтарэння. Гэтыя параўнання прымяняюцца ў дачыненні да канкрэтных моўных працэсараў, якія працуюць на канкрэтны тып тэхнікі, і не могуць быць выкарыстаны, каб зрабіць высновы аб агульнай адрозненні выканання розных моў у цэлым. Як мы ўжо працавалі на гэтых эксперыментаў, мы былі здзіўленыя тым, як неаднаразова часта інтуіцыя з'яўляецца няправільным. Некаторыя па-відаць невялікія змены прыводзяць да нечакана вялікіх адрозненняў прадукцыйнасці. Напрыклад,

- Сачыць пытанняў, даўжыня радка для выпрабаванні З-радок будаўніцтва на сістэмах Unix, але не на ПК;
- З выкарыстаннем Perl асацыятыўных масіваў, дзе індэксавацца масівы будуць служыць можа павялічыць Runtimes рэзка;
- У tcl8.0, `` код ўнутры цела працэдуры значна хутчэй, чым код па-за любой працэдуры''. [Ousterhout, прыватнае паведамленне.]


Нават інтуіцыі носьбітаў мовы можа быць няправільным. У адказ на заўвагі, мы змянілі некаторыя прыклады, каб быць больш размоўны, і выявілі, што гэтыя `` лучше''версии часам не працуе значна хутчэй, і нават можа працаваць павольна. Напрыклад,
Мы напісалі дзве схемы версій часу цыкла, радкі будаўніцтва, і колькасць слоў, адзін выкарыстання хваставой рэкурсіі выступае па схеме, прыхільнікі з адным з дапамогай варварскіх імпарту! Мноства -, розніца ў прадукцыйнасці паміж двума версіямі ніколі не перавышаў дзесяці адсоткаў, а не паслядоўна карысць адной версіі па параўнанні з іншымі.
- У больш ранніх версіях гэтага рукапісу, Perl эксперты заўважылі рэшткі ўведзеныя Awk да Perl перакладчык a2p, і прапанаваў разумную крытыку, што яна была несправядліва параўноўваць прадукцыйнасць код Perl, які быў створаны з механічнай рукой-закадаваным праграм у іншых мовах. Выдаленне ілжывых нарэзаць заяў ад праграм палепшылася іх выканання, але не больш чым на дзесяць адсоткаў. З іншага боку, гэта каля дзесяці адсоткаў хутчэй, каб стварыць масіў радкоў у хвасце відавочна, а не чытанне ўваходных файлаў адразу.


Само сабой зразумела, мы раім усім, хто хоча ведаць, якая версія праграмы будзе працаваць хутчэй пабудаваць тэставыя праграмы і высветліць, праўда іх працэсар мовы і машыны.

Нягледзячы на ??папярэднія агаворкі, мы эсэ наступнае рэзюмэ нашых назіранняў:

Awk і Perl блізкія па прадукцыйнасці. Awk пабег хутчэй прыкладна ў палове выпрабаванняў, у адрозненне ад агульнапрынятай, што Perl хутчэй, чым AWK.
Tcl значна павольней, чым Awk і Perl, як правіла, раз пяць ці дзесяць, але апошнія версіі байт-код звужае гэты разрыў значна. Схема уяўляецца вельмі прыблізна супастаўныя з Tcl (у бок ад аб'ёму ўводу / вываду, дзе інтэрпрэтаваць прадукцыйнасць Схемы безнадзейна); зноў, розныя метады хуткасць кампіляцыі паляпшэння гэтага паводзінаў.
Нашы эксперыменты не падтрымліваюць фальклору, што Java-перакладчыкаў ў 10 разоў павольней, чым C, акрамя выпадкаў, калі пакутліва павольнага ўводу / вываду бібліятэкі ўдзельнічаюць у адваротным выпадку стаўленне значна менш. Выкарыстаньне буфер ўводу / вываду функцый паляпшае Час аўтаномнай працы, але не больш чым у два разы. Проста ў кампіляцыі часу можа мець значны эфект, як правіла, выгадна.

Час з'яўляецца толькі адным з моў праграмавання; іншы прыдатнасць для задачы. Мовы сцэнарыяў прызначаныя для лёгка праграмаваць на, адзін ахвяры выканання і кантроль за прастату выразы. Мы не спрабуем вымераць выразнасці, але памер праграмы прапануе некаторыя падказкі. Агульны лік радкоў кода для не-графічных тэстах складае ад 66 для Awk, 96 з Perl, 105 з Tcl, 170 З і схема, 200 з Visual Basic, каля 350 для Java і нявызначанасці.

Параўнання асновай камп'ютэрнай літаратуры. Канферэнцыі, часопісы і часопісы поўныя табліц і маляўнічыя дыяграмы, параўнаць час выканання або памяці аднаго або некалькіх праграм на розных машынах або рэалізацыі. У святле зменлівасці ў выніках, якія мы бачылі, аднак, мы задаемся ці аналагічныя змены хаваецца за апублікаваны тэст даследаванняў, а таксама. Гэта здаецца разумным прыняць усе такія experimentsincluding thesewith вялікай доляй скептыцызму.

Падзякі

Дзякуючы Джон Бэнтлі, Марк Джэйсан Доминус-, Лорэнц Huelsbergen, Браян Льюіс, Дуг Макилрой, Джон Ousterhout, Роб Пайк, Арнольд Роббінс, Wolfram Schneider, Говард Трыкі і Філ Wadler, за карысныя прапановы і заўвагі па рукапісу. Мы таксама ўдзячныя Філ Wadler для выканання некаторых эксперыментах з ML, і будзе Клінгер для паляпшэння нашай схемы праграмы і для яго эксперыментаў параўноўваючы колькасць рэалізацый Схемы на нашай тэставай праграмы [Клінгер 97].

Спіс літаратуры



[Абельсон 96] Структура і інтэрпрэтацыя камп'ютэрных праграм (другое выданне), Х. Абельсон, GJ Суссман, Дж. Суссман, McGraw-Hill, 1996.

[Бекер 87] Р. Бекер, Л. Денби, Р. Макгіл, А. Р. Уилкс, `` Аналіз дадзеных з месцаў Ацэнка альманах,''амерыканскі статыстык, жнівень 1987 года. Рэгулюючы вагі, з якой асобныя кампаненты аб'ядноўваюцца ў рахунак, можна зрабіць амаль любое месца выглядаць добра ці дрэнна.

[Bentley 91] Элементарныя C Кошт мадэлі, Бэнтлі, Керниган і ван Вік (Unix Review, люты, 1991), апісвае адну спробу зрабіць сістэматычныя вымярэння кошту асноўных аперацый на адной мове, C.

[Блюм 94] VSCM партатыўны план мерапрыемстваў, Матыяс Блюм. Www.cs.Princeton.edu / ~ Блюм / vscm.

[Бут 97] ўнутраных цыклаў, Рык Бут (Addison-Wesley, 1997), з'яўляецца выдатным спасылкай на ПК праграмы наладкі.

[Кафеін 97] http://www.webfayre.com/cm.html. `` CaffeineMark Java Benchmark,''Пендрагон праграмнага забеспячэння.

[Клінгер 97] Уільям С. Клінгер, http://www.ccs.neu.edu/home/will/Twobit/kvwbenchmarks.html. Параўноўвае выпрабаванняў з гэтага дакумента на розных рэалізацый Scheme.

[Гослінг 97] Прыватнае паведамленне.

[Хардвик 97] http://www.cs.cmu.edu/ ~ JCH / Java / optimization.html. Джонатан Хардвик ў `` Java Оптимизация''Веб-старонка утрымлівае розныя крытэрыі для праграм Java і спасылкі на звязаных з ім матэрыялаў.

[Керниган 91] BW Керниган, `` AWK на C + + перакладчык,''USENIX C + + канферэнцыя, Вашынгтон, акруга Калумбія, красавік 1991 года.

[Схема 91] Перагледжаныя ^ 4 Даклад на алгарытмічная мова Схема (лістапад 1991), пад рэдакцыяй Клінгер і Рысу, гэта афіцыйнае вызначэнне.

Ніжэй паказаныя стандартныя спасылкі на розныя мовы і звязаныя з ім матэрыялы па ацэнцы эфектыўнасці. Гэта не цытуецца ў тэксце.



Мовы праграмавання AWK, па Ахо, Керниган і Вайнбергер (Addison-Wesley, 1988), з'яўляецца стандартнай спасылкай; Арнольд Роббінс "Эфектыўнае AWK Programming (SSC, 1996) новыя спасылкі.

Perl 5 лепш за ўсё апісаны ў праграмаванне на Perl, другая рэдакцыя, сцены, Кристиансен і Шварц (O'Reilly, 1996).

у Tcl Ousterhout і Tk Toolkit (Addison-Wesley, 1994), канчатковае апісанне версіі 7.4/3.6.

Java-Фланаган ў двух словах (O'Reilly, 1996 [першае выданне]) з'яўляецца выдатным увядзеннем; Арнольд і Гослінг праграмаванні на мове Java (Addison-Wesley, 1996) з'яўляецца добрай альтэрнатывай.

Limbo і Inferno лепш за ўсё апісаны на вэб-старонцы Inferno, http://inferno.bell-labs.com.

Ёсць мноства кніг па Visual Basic; спасылкі Microsoft і інструкцый з'яўляюцца канчатковымі.

Published (Last edited): 12-06-2011 , source: http://cm.bell-labs.com/cm/cs/who/bwk/interps/pap.html