46
Общий раздел / Re: Расширенный тест на производительность.
« : Декабрь 01, 2016, 05:51:04 pm »
Так задача в этом и состоит, не?
Онлайн компилятор Oberon-07/11
Путеводитель по Оберон-проектам.
Логи jabber-конференции.
Онлайн исходники BlackBox: тут:WeBB и на github
Исходники Project Oberon V4 на github.
Сборник решений задач книги "Современное программирование с нуля!" тут. А обсуждение здесь.
В этом разделе можно просмотреть все сообщения, сделанные этим пользователем.
А в чем проблема? Итератор можно сделать в любом ЯП, только сахара будет меньше.А причем там итератор?
И как вот такое переводить буква к букве?
- Третий этап - берем самую быструю реализацию из второго этапа и пытаемся её воспроизвести на своем ЯП дословно, т.е. максимально близко к оригиналу. В идеале - буква к букве, настолько, насколько это возможно
std::sort(block.begin(), block.end());
mmap противоречит ограничению по памяти (весь файл нельзя мэпнуть).Не противоречит. Нужна ведь не память, а адресное пространство.
- LSR. Такой процедуры нет, но она однозначно нужна. Тоже добавил в дополнение к LSL.А разве нельзя вместо LSR(x, n) использовать LSL(x, -n)?
Это в обероне все типы модулей слепили в один, чтобы не усложнять и не думать. В реальной жизни это не годится.В реальной жизни вообще обходятся без модулей.
MODULE Queens;
IMPORT Out:=StdLog, Kernel;
VAR count:INTEGER;
board: ARRAY 32 OF INTEGER;
PROCEDURE canplace(row,col:INTEGER):BOOLEAN;
VAR i:INTEGER;
BEGIN
i:=1;
WHILE (i < row) & (board[i] # col) & (ABS(board[i]-col) # ABS(i-row)) DO
INC(i)
END;
RETURN i = row
END canplace;
PROCEDURE queen(row, n:INTEGER);
VAR col:INTEGER;
BEGIN
FOR col := 1 TO n DO
IF canplace(row,col) THEN
board[row] := col;
IF row = n THEN count := count + 1 ELSE queen(row+1, n) END
END
END
END queen;
PROCEDURE solve(n:INTEGER);
BEGIN
count := 0;
queen(1,n);
END solve;
PROCEDURE Do*(N:INTEGER);
VAR starttime, endtime:LONGINT;
BEGIN
Out.String("Solving "); Out.Int(N); Out.String(" Queens Problem") ;Out.Ln;
starttime := Kernel.Time();
solve(N);
endtime := Kernel.Time();
Out.Int(count); Out.String(" solutions found t ="); Out.Real((endtime-starttime)/1000); Out.Ln;
END Do;
END Queens.
Вот для BB. Для других приходится переделывать немного.
#include <stdio.h>
#include <time.h>
int board[32], count;
int can_place(int row,int col) {
int i = 1;
while((i < row) && (board[i] != col) && (abs(board[i]-col) != abs(i-row))) ++i;
return (i == row);
}
void queen(int row,int n) {
int col;
for(col=1; col<=n; ++col) {
if(can_place(row,col)) {
board[row] = col;
if(row==n) ++count; else queen(row+1, n);
}
}
}
void solve(int n) {
count = 0;
queen(1,n);
}
int main(int argc, char **argv) {
int N;
clock_t starttime, endtime; float runtime;
N = 13;
if (argc == 2) N = atoi(argv[1]);
printf("Solving %d Queens Problem ... \n", N );
starttime = clock();
solve(N);
endtime = clock();
runtime = (endtime-starttime)/1000.0;
printf(" %d solutions found, t = %f \n", count, runtime );
return 0;
}
Запускал на разных компьютерах и усреднял относительное время среднепотолочно. За попугая принято время выполнения на BlackBox.