Некалькі агульных прынцыпаў ўваходзяць:
Хоць мова КОЖНАГА свеціць у некаторых сітуацыях, там бачныя і часам цалкам нечаканым Недахопы Што павінна быць яшчэ ў звычайных дадатках. Мы сутыкнуліся з памылкамі, абмежаванні па памеры, ніякавата асаблівасці, а агульная таямніцы для любога мовы.
Гэты артыкул апісвае эксперыменты з мэтай параўнання прадукцыйнасці скрыптовых моў (як Awk, Perl і Tcl) і інтэрфейс патэнцыялу мовах (напрыклад, Tck / Tk, Java і Visual Basic) уяўляе сабой набор прадстаўнік вылічальных задач. Мы знайшлі гэтую складаную, з цяжкасцямі і больш выразныя вынікі менш, чым мы чакалі.
З сцэнарыяў і інтэрфейс патэнцыялу мовы тлумачыцца як правіла, з выкарыстаннем ет Некаторыя ахвяры хуткасць у абмен на выгоды праграмавання. На гэты раз `` wasted''CPU не мае значэння, для сцісласці, праграмы аднаразовыя, або для праграм, якія працуюць толькі ў некалькіх "секунд, і не мае значэння, калі скрыптовая мова выкарыстоўваецца ў асноўным як `` glue''to кіравання Эфектыўнае буйнамаштабных аперацый. Праграмы для невялікі, але дробных наборы дадзеных канадскіх ператварыцца ў вялікія праграмы, якія мы запускаем вялікія наборы даных, напрыклад, Awk і Perl былі выкарыстаны для напісання праграм тысяч ліній Гэты працэс мегабайт набораў дадзеных. А часам клей Развіваецца сябе ў асноўных кампанентаў дадатку года. Па Колькасная як розныя мовы хутка бегаць, прадукцыйнасць параўнання могуць "прапаноўваць, якую б мэтазгодна мовы для розных акцый прымянення годзе, і што можа быць Штраф за зручнасці выбару за эфектыўнасцю.
На першы погляд, параўнанне Runtimes здаецца простым. Выберыце поўны набор прадстаўнік задачы, пісаць эквівалентных праграм на розных мовах, асяроддзі выканання меры на некалькі сістэм, то гэта іх усіх у табліцы. Гэта з'яўляецца відавочным абагульненнем падыходу выпрабаванні праграмы, якія ствараюць кошт мадэлі для прымітыўных аперацый у адной мове, як З [Bentley 91] і арыенціры, якія параўноўваюцца рэалізацыі адной мове, як Java [97 Хардвик, кафеін 97].
Мабыць лёгкая праца параўнання, аднак, аказалася значна больш, чым фізічных практыкаванняў. Мы сутыкнуліся з праблемамі, загадкі і сюрпрызы на кожным кроку. Спадзяемся, што гэты часопіс Наш дастаўцы заклікае чытачоў для прагляду апублікаваных Параўнанне з асцярогай, а таксама распрацаваць і выконваць свае ўласныя эксперыменты старанна.
Пры прадстаўленні вынікаў нашых эксперыментаў, у выхадныя дні часта кажуць, што праграма пабег на адной мове некаторы колькасць хутчэй павольней, чым золата год эквівалентнай праграмы на іншай мове. Усе такія выніковая ўяўляе здымак ў летам 1997 года, аб выкананні мовы працэсары даступныя, якія павінны былі нас. Тейс не даюць ордэр на высновы аб параўнальнай эфектыўнасці Іншыя мовы выкарыстоўваюць машыны або іншыя версіі праграмнага забеспячэння.
Хоць стан Многія Мы не можам абгрунтаваныя высновы, Ёсць некаторыя тэмы паўтараюцца Гэта часта апісваецца ў эксперыментах ніжэй.
Мы пачалі будаваць табліцы з трыма вымярэннямі: задачы, мова праграмавання, і машыны. У рэшце рэшт выхадныя Паведамленні Памер праблема вырашана праграмы чацвёртае вымярэнне, і прэзентацыя выхадныя змянілася з табліц да графікам. Праблема рознага памеру дапамаглі нам выявіць незвычайныя эфекты асяроддзя, а графічнае прадстаўленне падкрэслівае формы і тэндэнцыі ў рэжыме выканання, а не асобныя ацэнкі прадукцыйнасці.
Мы прадстаўляем вымярэнняў па кожнаму элементу задачы асобна. У адрозненне ад некаторых быў бенчмаркинга даследаванні, мы не аб'яднаць вынікі розных эксперыментаў у адзін нумар. Адна праблема з гэтай агульнай практыкі, што можна выбраць для стварэння розных вагавых каэфіцыентаў Амаль любы жаданы вынік [Бекер 87].
Цяжка валюце невялікі, але прадстаўнік задач, якія не даюць занадта вялікі краю да адной мовы празмерна караць яшчэ адну залатую. У ідэале, кожная задача будзе выпрабоўваць толькі адну ці дзве асаблівасці мовы, і запатрабуе кароткія, простыя, лёгкія і праграмы, якія з'яўляюцца натуральнымі для выражэння на любой мове. Для параўнання быць адчувальным aussi праграмы павінны быць выяўленыя ў `` colloquial''fashion на мове КОЖНАГА. Хоць мы не сьцьвярджаем, што любы з задач, суботах і нядзелях гэты з'яўляецца канчатковым, мы лічым, гэта значыць кожны разумна справядлівым.
У нас ёсць прэзентацыі, арганізаванай па тыпу задач: асноўныя асаблівасці мовы (раздзел 3), масівы і радкі (раздзел 4), уваход / выхад (раздзел 5); асноўныя аперацыі GUI (раздзел 6). Раздзел 7 апісвае эксперыменты з кампіляцыяй. Кожны раздзел ўключае ў сябе дадатковыя тлумачэнні задач. Праграмы і дадзеныя выпрабаванняў можна азнаёміцца ??на www.cs.bell-labs.com/ ~ BWK.
Мы ажыццяўляем таймінгаў для васьмі мовах прадстаўленыя ў табліцы 1. 
(1) Укладанне Tk для Perl і схема па ўсёй бачнасці, эксперыментальныя і падтрымкі, мы не спрабавалі іх.
Табліца 1: Характарыстыкі мовы
Улічваючы больш часу і энергіі, можна было б тэст моў сцэнарыяў, як іншыя абалонкі Unix, Python і REXX, функцыянальных моў, такіх як SML, і інтэрфейс патэнцыялу моў, такіх як Delphi.
O Мы правялі тэсты на тры машыны:
Цяжкасці вымярэння праграма Час аўтаномнай працы надзейна і прайграваны добра вядомая. Мы сутыкнуліся наступныя бар'еры, у прыватнасці:
Час для 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
Першае практыкаванне тэставанне асноўных асаблівасцяў мовы, як арыфметыка, завесы і выклікі функцый.
Спачатку выпрабаванні Ажыццяўленне завесы накладныя выдаткі шляхам падліку Механізмы п. Выкарыстаньне вялікіх значэнняў п Дапамагае знізіць узровень шуму ў вымярэння часу. Праверка, лінейнай асяроддзя ў кошт не дапаможа выявіць Амбіцыйныя аптымізатараў (гл. ніжэй).
Праграмы ў большасці моў выглядаць. Напрыклад, вось версія C:
int i, n = atoi(argv[1]), sum = 0; for (i = 0; i < n; i++) sum++;
set sum 0
set n [lindex $argv 0]
for {set i 0} {$i < $n} {incr i} {
incr sum
}
(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))
Для нереконструированная неабходна стылі праграмістаў, схема вызначае ітэрацыі пабудаваць (do),, З якой завесы вышэй, могуць быць запісаны наступным чынам:
(define sum 0) (define (do-loop n) (do ((i 0 (+ i 1))) ((>= i n) sum) (set! sum (+ sum 1))))
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)
Для вялікая праблема памеру (K = 8), парадак моў за кошт павелічэння часу выканання застаецца аднолькавым ва ўсіх трох сістэмах. (Асноўны тэст завесы вынікі таксама паказалі межсистемные паслядоўнасці, але з тых мовах, на іншым парадку.) Тут, схема і Awk бег хутчэй, чым Perl, і Limbo бег хутчэй, чым Visual Basic. Такія агульнай ўзгодненасці паміж сістэмамі рэдка.
Усе гэтыя мовы забяспечваюць багатыя масівы і радкі, чым у 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)
}
}
Праграма 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;
}
}
String test
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++;
}
}
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 клас, выкарыстоўваны бедных хэш-функцыі. Але для выканання выпрабаванняў павялічваецца, калі яно паўтараецца, што дазваляе выказаць здагадку, што могуць быць праблемы з кіраваннем памяццю.
Тэсты ў папярэдніх раздзелах вымераная хуткасць сыравіны вылічэнняў і кіравання памяццю. У адрозненне ад праграмы ў гэтым раздзеле ўзаемадзейнічаць з навакольным светам, чытанне некаторых значны аб'ём дадзеных, робіць некаторыя вылічэнні на кожнага элемента дадзеных, або выказаць нейкія выхад. Гэтыя аперацыі з'яўляюцца тыповымі для 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
}
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 }
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]
}
@a = <>;
for ($i = $#a; $i >= 0; $i--) {
print $a[$i];
}
Файл развароту тэст
Парадак моў выканання такой жа, ва ўсіх трох сістэм. Слова падліку задача таксама выстаўленыя крыжаванай сістэмы ўзгаднення, але мовы з'явіліся ў іншым парадку.
Наступны тэст практыкаванні ўваход, лічбавы пераўтварэнні, і арыфметыка. Праграмы чытаюць 100000 лікаў з плаваючай кропкай, як гэта
513.871 -175.726 308.634 ...
{ s += $1 }
END { print s }
Sum test
Парадак моў выканання супастаўна з для таго, каб слова рахункі, за выключэннем Tcl (які атрымаў павольней) і Visual Basic (які атрымаў хутчэй). На самай справе, наша арыгінальная праграма Tcl бег хутчэй, але вылічыць розныя сумы, чым любы з іншых праграм; таймінгі прыведзеныя для Tcl праграма, якая відавочна задае tcl_precision да 17 гадоў.
Ёсць два асноўных кампанентаў карыстацкіх інтэрфейсаў, дзе хуткасць галоўнае: працы з тэкстам у `` тэкставы віджэт,''і малявання графічных аб'ектаў, такіх як лініі, прастакутнікі і колы. Вядома, такія аперацыі, як павышэнне дыялогавых вокнаў або знос пунктаў меню павінна адбыцца хутка, але іх асяроддзе не мае вялікага значэння для агульнай прадукцыйнасці.
Тэкст тэст дадае N кароткія лініі на полі, па аднаму за раз, і прычыны апошняй радку будзе адлюстроўвацца кожны раз. Завесы Tcl выглядае наступным чынам:
for {set i 1} {$i <= $n} {incr i} {
.t insert end "$i\n"
.t see end
update
}
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");
}
For i = 1 To n bigtext.Text = bigtext.Text & CStr(i) & crlf bigtext.SelStart = Len(bigtext.Text) bigtext.SelLength = 0 DoEvents Next i
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);
}
Лінія / акружнасці малюнак тэст
Гэтыя часы найменш надзейныя, бо кожная адлюстроўвае праектных рашэнняў у рэалізацыі адпаведнай сістэмы. Раз паведамілі ўнутраных таймераў ў праграмы ніжняя мяжа на тое, што бачыць карыстальнік, у нас не ўключаны любыя дадатковыя затрымкі, што адбываецца да экрана абнаўляецца.
Час аўтаномнай працы значна ўзрасце ў выпадку відавочнага абнаўлення дададзены пасля кожнай аперацыі малявання, так як яны могуць быць у некаторых відах анімацыі. Java і Visual Basic па ўсёй бачнасці, абнаўленне экрана бесперапынна, нават калі гэта паводзіны не прасіў. ТЗ і Limbo абнаўлення адключаныя і альбо адбудзецца, усё адразу (ТЗ), або спарадычна (Limbo).
У цэлым, графіка аб'екты істотна адрозніваюцца, нашы выпрабаванні засяродзіцца на элементарных задач. Віджэт палатна ТЗ (праз Tcl або Limbo) значна багацей і больш гнуткім, чым тое, што даступна ў Java або Visual Basic, але гэты тэст не ажыццяўляць гэтыя магчымасці на ўсіх.
У простыя часы, `` сборник''означает пераклад з зыходнага кода з дапамогай асэмблера ў машынны інструкцыі. Праграма была складзена раз, магчыма, з крыху аптымізацыі, і ў выніку выкананы файл малюнка, які ніколі не змяніліся. Сёння, `` сборник''является больш складаным.
Мовы сцэнарыяў прапануюць некалькі прамежкавых пазіцый, з некалькі значэнняў нават для `` интерпретации''Tcl 7,6 і 7,3 Схема чыста перакладчыкаў, якія неаднаразова аналізу зыходнага кода, як яны бягуць;. Гэта вельмі гнуткі, але самы павольны з усіх, як графы вышэй ясна паказваюць. Awk перакладае сваю праграму ў дрэва, які ішоў пад час выканання, Visual Basic стварае ўнутранае прадстаўленне р-кода, і Java і Limbo пераклад у байт-коды для віртуальных машын (яшчэ адна форма р-код). Такая папярэдняя апрацоўка дазваляе паскарэнняў намаляваныя на графіках ніжэй.
У кожным выпадку, можна ўзяць працэс ішоў далей, альбо шляхам перакладу арыгінальнай праграмы ў нешта хутчэй, як C або C + +, або шляхам кампіляцыі байт-код у машынныя каманды, альбо да выканання або па патрабаванні падчас выканання (`` толькі ў час кампіляцыі''). Графаў ніжэй паказаны вынікі некаторых эксперыментаў з `` сборник''средств, якія прадстаўляюцца некалькімі з гэтых моў:
Складальнік часу / інтэрпрэтаваць час, па мове
Складальнік часу / інтэрпрэтаваць час, задача
Гэтыя графікі паказваюць шэраг цікавых фактаў. Кампіляцыя звычайна, але не заўсёды, зніжае час выканання, а ў некаторых выпадках ён зрабіў прадукцыйнасць значна горш. Большасць паляпшэнняў з'яўляюцца сціплымі, а некаторыя мовы (напрыклад Limbo) маюць вялікі дыяпазон паляпшэнне, у той час як іншыя (напрыклад, Visual Basic) назіраецца толькі ў вузкім дыяпазоне. Не дзіўна, што найбуйнейшыя паляпшэнняў для простай мова featuresthose большасць як звычайныя мовы праграмавання, такім чынам, асноўныя выпрабаванні завесы і функцыі Акермана палепшыць большасць, а I / O выпрабаванняў палепшыць меры (калі сістэма ўводу / вываду таксама закадаванай у мове у пытанне, як гэта з Limbo і, здаецца, з Java).
Ясна адно можа выконваць мноства іншых эксперыментаў, напрыклад, для запаўнення ў больш моўныя асаблівасці на больш сістэматычнай аснове, для расследавання рэгулярных выразаў (у 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).
Кіраванне памяццю таксама мае значэнне. Здаецца відавочным, што некаторыя з нашых тэстаў паўсталі праблемы з ажыццяўленнем збору смецця. Звычайны сімптом Час аўтаномнай працы, што павелічэнне ў ходзе серыі выпрабаванняў. Іншымі фактарамі з'яўляюцца проста па-за кантролю, і, магчыма, нават за межамі пазнання. Сучасныя машыны выкарыстоўваюць некалькі узроўняў кэш-памяці, каб павольна асноўнай памяці па ўсёй бачнасці, працуюць амаль з хуткасцю кэш-памяці, але розныя працэсары (усе з той жа намінальным хуткасці) маюць розную колькасць і віды кэш-памяці.
Абмежаванні гэтыя вынікі маюць важнае значэнне і нясуць паўтарэння. Гэтыя параўнання прымяняюцца ў дачыненні да канкрэтных моўных працэсараў, якія працуюць на канкрэтны тып тэхнікі, і не могуць быць выкарыстаны, каб зрабіць высновы аб агульнай адрозненні выканання розных моў у цэлым. Як мы ўжо працавалі на гэтых эксперыментаў, мы былі здзіўленыя тым, як неаднаразова часта інтуіцыя з'яўляецца няправільным. Некаторыя па-відаць невялікія змены прыводзяць да нечакана вялікіх адрозненняў прадукцыйнасці. Напрыклад,
Нягледзячы на ??папярэднія агаворкі, мы эсэ наступнае рэзюмэ нашых назіранняў:
Час з'яўляецца толькі адным з моў праграмавання; іншы прыдатнасць для задачы. Мовы сцэнарыяў прызначаныя для лёгка праграмаваць на, адзін ахвяры выканання і кантроль за прастату выразы. Мы не спрабуем вымераць выразнасці, але памер праграмы прапануе некаторыя падказкі. Агульны лік радкоў кода для не-графічных тэстах складае ад 66 для Awk, 96 з Perl, 105 з Tcl, 170 З і схема, 200 з Visual Basic, каля 350 для Java і нявызначанасці.
Параўнання асновай камп'ютэрнай літаратуры. Канферэнцыі, часопісы і часопісы поўныя табліц і маляўнічыя дыяграмы, параўнаць час выканання або памяці аднаго або некалькіх праграм на розных машынах або рэалізацыі. У святле зменлівасці ў выніках, якія мы бачылі, аднак, мы задаемся ці аналагічныя змены хаваецца за апублікаваны тэст даследаванняў, а таксама. Гэта здаецца разумным прыняць усе такія experimentsincluding thesewith вялікай доляй скептыцызму.
Дзякуючы Джон Бэнтлі, Марк Джэйсан Доминус-, Лорэнц Huelsbergen, Браян Льюіс, Дуг Макилрой, Джон Ousterhout, Роб Пайк, Арнольд Роббінс, Wolfram Schneider, Говард Трыкі і Філ Wadler, за карысныя прапановы і заўвагі па рукапісу. Мы таксама ўдзячныя Філ Wadler для выканання некаторых эксперыментах з ML, і будзе Клінгер для паляпшэння нашай схемы праграмы і для яго эксперыментаў параўноўваючы колькасць рэалізацый Схемы на нашай тэставай праграмы [Клінгер 97].
Ніжэй паказаныя стандартныя спасылкі на розныя мовы і звязаныя з ім матэрыялы па ацэнцы эфектыўнасці. Гэта не цытуецца ў тэксце.