Olej писал(а):
Сделал!
Пока сравнение только 3-х языков, которые меня на сейчас интересуют: C, C++, Go.
И разных компиляторов: GCC + Clang для C, GCCGO + GoLang для Go.
Итого, у нас есть 2 класса задач:
1. числа Фибоначчи - это производительность чисто на массированных функциональных вызовах, сама рекурсия здесь не важна;
2. сортировка - это алгоритм массовой еперстановки элементов, копирований малых структур данных.
Ещё могу показать пару сравнений ... широко известные алгоритмы:
1. "Ханойская башня"
C:
Код: Выделить всё
#include <stdio.h>
#include <stdlib.h>
// ============>
// -|- | |
// --|-- | |
// ---|--- | |
// 1 2 3
char debug = 0;
ulong nopr = 0;
void put( int from, int to ) {
++nopr;
if( !debug ) return;
printf( "%d => %d, ", from, to );
if( 0 == ( nopr % 5 ) ) printf( "\n" );
}
int temp( int from, int to ) { // промежуточная позиция
int i = 1;
for( ; i <= 3; i++ )
if( i != from && i != to )
return i;
return 0; // ошибка
}
void move( int from, int to, int n ) {
if( n > 1 ) move( from, temp( from, to ), n - 1 );
put( from, to ); // единичное перемещение
if( n > 1 ) move( temp( from, to ), to, n - 1 );
}
int main( int argc, char **argv, char **envp ) {
if( argc != 2 )
printf( "usage: %s [-]<number>\n", argv[ 0 ] ), exit( 1 );
int size = atoi( argv[ 1 ] ); // число переносимых фишек
if( size < 0 ) size = -size, debug = 1;
if( debug ) printf( "размер пирамиды: n=%d\n", size );
move( 1, 3, size ); // вот и всё решение!
if( debug && ( nopr % 5 ) != 0 ) printf( "\n" );
printf( "число перемещений %ld\n", nopr );
return 0;
}
Go:
Код: Выделить всё
package main
import( "os"; "strconv" )
var debug bool = false
var nopr uint64 = 0
func move( from, to, сколько int ) {
put := func( from, to int ) {
nopr++;
if !debug { return }
print( from, " => ", to, ", " )
if 0 == ( nopr % 5 ) { print( "\n" ) }
}
temp := func( from, to int ) int { // промежуточная позиция
for i := 1; i <= 3; i++ {
if i != from && i != to { return i }
}
panic( 0 ); // ошибка
}
if сколько > 1 { move( from, temp( from, to ), сколько - 1 ) }
put( from, to ) // единичное перемещение
if сколько > 1 { move( temp( from, to ), to, сколько - 1 ) }
}
func main() {
if len( os.Args ) != 2 {
print( "usage: ", os.Args[ 0 ], " [-]<number>\n" )
return
}
debug = false
размер, _ := strconv.Atoi( os.Args[ 1 ] )
if размер < 0 { размер, debug = -размер, true }
if debug { print( "размер пирамиды: n=", размер, "\n" ) }
move( 1, 3, размер ) // вот и всё решение!
if debug && ( nopr % 5 ) != 0 { print( "\n" ) }
print( "число перемещений ", nopr, "\n" )
}
И выполение (те же GCC + Clang для C | GCC + GoLang):
Код: Выделить всё
[Olej@modules hanoy]$ time ./hanoy_c 27
число перемещений 134217727
real 0m2.648s
user 0m2.631s
sys 0m0.002s
[Olej@modules hanoy]$ time ./hanoy_cl 27
число перемещений 134217727
real 0m2.511s
user 0m2.498s
sys 0m0.001s
[Olej@modules hanoy]$ time ./hanoy_go 27
число перемещений 134217727
real 0m5.449s
user 0m5.420s
sys 0m0.010s
[Olej@modules hanoy]$ time ./hanoy_gol 27
число перемещений 134217727
real 0m2.334s
user 0m2.333s
sys 0m0.001s
Можно считать, что это одни и те же цифры ... потому как отличие в 2 раза - это очень мало когда существенно.