Tôi đã viết một chương trình cơ bản Hippity Hop trong C, Python và OCaml. Cấp, điều này có lẽ không phải là một điểm chuẩn rất tốt của ba ngôn ngữ này. Nhưng kết quả tôi nhận được là một cái gì đó như thế này:Tại sao chương trình OCaml này nhanh hơn chương trình C của tôi?
- Python: 0,350 giây
- C: 0,050 giây
- giải thích OCaml: 0,040 giây
- biên soạn OCaml: 0,010
Hiệu suất trăn không thực sự gây ngạc nhiên cho tôi, nhưng tôi khá sốc khi thấy OCaml nhanh như thế nào (đặc biệt là phiên bản phiên dịch). Để so sánh, tôi sẽ đăng phiên bản C và phiên bản OCaml.
C
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
long get_count(char *name);
int main(int argc, char *argv[])
{
if (argc != 2){
printf("Filename must be specified as a positional argument.\n");
exit(EXIT_FAILURE);
}
long count_no = get_count(argv[1]);
int i;
for (i = 1; i <= count_no; i++){
if (((i % 3) == 0) && ((i % 5) == 0)){
printf("Hop\n");
continue;
}
if ((i % 3) == 0){
printf("Hoppity\n");
}
if ((i % 5) == 0){
printf("Hophop\n");
}
}
return 0;
}
long get_count(char *name){
FILE *fileptr = fopen(name, "r");
if (!fileptr){
printf("Unable to open file %s.\n", name);
exit(EXIT_FAILURE);
}
size_t text_len = 20;
char *file_text = calloc(text_len, sizeof(char));
while (!feof(fileptr)){
fread(file_text, sizeof(char), text_len, fileptr);
assert(!ferror(fileptr));
text_len += 20;
file_text = realloc(file_text, text_len * sizeof(char));
}
long file_as_int = strtol(file_text, NULL, 10);
free(file_text);
return file_as_int;
}
OCaml
open String;;
let trim str =
if str = "" then "" else
let search_pos init p next =
let rec search i =
if p i then raise(Failure "empty") else
match str.[i] with
| ' ' | '\n' | '\r' | '\t' -> search (next i)
| _ -> i
in
search init
in
let len = String.length str in
try
let left = search_pos 0 (fun i -> i >= len) (succ)
and right = search_pos (len - 1) (fun i -> i < 0) (pred)
in
String.sub str left (right - left + 1)
with
| Failure "empty" -> ""
;;
let rec iterate_over_numbers curr_num max_num =
(
if curr_num <= max_num then (
if ((curr_num mod 3) == 0) && ((curr_num mod 5) == 0) then
print_endline "Hop"
else if (curr_num mod 3) == 0 then
print_endline "Hoppity"
else if (curr_num mod 5) == 0 then
print_endline "Hophop";
iterate_over_numbers (curr_num + 1) max_num
))
;;
let fname = Sys.argv.(1);;
let infile = open_in fname;;
let file_text = trim (input_line infile);;
close_in infile;;
let input_number = int_of_string file_text;;
iterate_over_numbers 1 input_number;;
Nhưng tôi tò mò muốn biết lý do tại sao tôi nhận được những kết quả này. Tôi đang làm điều gì đó câm trong chương trình C của tôi, hay đây chỉ là một cái gì đó OCaml nhanh hơn? Dường như với tôi một chút lạ rằng một chương trình giải thích đang chạy nhanh hơn một chút so với phiên bản C, và chương trình biên dịch chạy nhanh gấp 5 lần.
Trình chuyển đổi trình biên dịch nào bạn đã sử dụng cho phiên bản C? –
@ Jonathan - Tôi chỉ làm một 'gcc -o hoppity main.c'. Tôi không nghĩ về việc thiết lập một mức độ tối ưu để trung thực. :-) –
Số trong tệp khi thử nghiệm được chạy là gì? Và đầu ra có được chuyển hướng đến một tệp hoặc một đường ống giống nhau cho tất cả các thử nghiệm không? Và thật thú vị khi biết hiệu suất tương đối với 'gcc' và 'gcc -O'. –