Đua tốc độ Python, Golang và C

Test tìm số nguyên tố từ 1-1000000 sử dụng thuật toán cơ bản :blush:
C hoàn thành trong 42s 221s
Golang :224s
Python: Không thể chờ được (hơn 900s chưa xong) :joy: , chắc phải gọi à turthon mất :smile:

[Hướng dẫn làm ảnh Gif][1]

##Code test:

  • C


#include <conio.h>
#include <stdio.h>
#include <windows.h>


int main ( )
{
    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    CONSOLE_SCREEN_BUFFER_INFO consoleInfo;
    WORD saved_attributes;
    SetConsoleTextAttribute(hConsole, FOREGROUND_GREEN);
    int n,i;
    printf("@thanhmssl10 DNH\n'C' Prime test\n 1- 1000000\nEnter to start!\n");

    getch();
    for (n=1;n<=1000000;n++)
        for(i=2;i<n;i++)
        {
            if (n%i==0)
                break;
            else if( i==n-1)
                printf("\n%d",n);

        }

    printf("\nDONE!");
    getch()
    ;

}
  • Python
raw_input("@thanhmssl10 DNH\n'Python' Prime test\n 1- 1000000\nEnter to start!\n")
for n in range(1,1000000):
    for i in range(2,n-1):
        if n%i==0:
            break
        elif i==n-2:
            print "%d" % n
print "\nDONE!"
  • Golang
package main


import "fmt"


func main() {
    fmt.Printf("@thanhmssl10 DNH\n'GOlang' Prime test\n 1- 1000000\nEnter to start!\n")
    var a int
    fmt.Scanf("%d\n",&a)
    
        for n := 0; n < 1000000; n++ {
            for i:=2;i<n;i++{
                if n%i==0 {
                    break
                }else if i==n-1{
                    fmt.Printf("\n%d",n)
                }
                
                
            }
            
        }
    fmt.Printf("\nDONE!")
}

  • Đếm giờ (Chạy bằng lệnh cmd)
echo off && color c && for /l %i in (1,1,10) do timeout 1 >nul && echo %is
2 Likes

Cứ tưởng Golang đứng đầu chứ nhỉ ?

1 Like

Quan trọng là bạn dùng thuật toán gì.

  • golang theo mình nghĩ test golang thì phải build ra rồi mới run dc.
$> go run primes.go

thì nó phải biên dịch xong rồi chạy

###python sieve 10^6

#kết quả
time: 0.69 memory: 8776 signal:0
number of primes: 78498
0-100: [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
5 last primes [999953, 999959, 999961, 999979, 999983]

###test với golang

0.01s 789504KB

1 Like

Em vừa đo lại thì C với Go ngang nhau :blush:, em dùng thuật toán bình thường ạ, không dùng cả sqrt luôn :smile:

Vẫn thua C 1 tí :smiley:

chú theo đường nghiên cứu được đấy, a bó tay giờ chạy in ra dòng print của C còn không biết :disappointed_relieved:

1 Like

Em nghịch chơi thôi, cũng không định đi sâu vào C/py/go :smile:

thời gian thưởng thức đấy bác ạ :smile:

1 Like

Mình muốn thử ông python thế nào thôi :smile: , ai ngờ nó chậm quá

Trước em cũng có dùng Python. Nhưng mà chạy trên ĐT S60 cơ. Cũng nặng máy với ì ạch lắm :v:

1 Like

À đúng rồi :+1:, quên mất chưa thử trên android :smile:


@gio Anh có biết thuật toán nào mà người ta hay dùng để test tốc độ các ngôn ngữ không ạ :blush:,

2 Likes

Mình tưởng điều này ai cũng biết chứ nhỉ :blush:. Cái đó là sự đánh đổi giữa thời gian thực thi và thời gian phát triển. Đương nhiên trong nhiều trường hợp với yêu cầu không quá cao, việc lựa chọn thời gian phát triển nhanh hơn nhưng tốc độ thực thi thấp hơn đem lại nhiều hiệu quả hơn về thời gian và chi phí.

Python có những cách riêng để tăng tốc chương trình, nhưng đương nhiên sẽ không bằng các ngôn ngữ static được.

Golang mình nghe cũng lâu rồi mà chưa tìm hiểu sao nó đạt được hiệu năng như vậy, không biết có cao nhân nào ở đây không :p?

2 Likes

Mình cũng thấy mọi người bảo chậm rồi nhưng mà không nghĩ nó chậm quá như vậy :joy:

cho bác cái link để xem http://fengmk2.com/blog/2011/fibonacci/nodejs-python-php-ruby-lua.html, không thể so sánh python được vì nó là ngôn ngữ động, trong khi 2 bác kia là tĩnh

(^_^) c > java > go > scala > luajit > nodejs > ruby 2.0.0-p0 > pypy > ruby 1.9.3+ > lua > php > python > perl > ruby 1.8.x (T_T)

1 Like

Cái đó là sự đánh đổi giữa thời gian thực thi và thời gian phát triển.

Bác giải thích cho em cụm thời gian phát triển này được ko :smiley: cám ơn bác.

Tốc độ thực thi nhanh là 1 trong những nguyên nhân khiến C/C++ dùng nhiều trong ngành tài chính (nhất là high frequency trade) thì phải :-?

2 Likes

Lại còn được ông ruby nữa :blush:, vậy mới thấy không cần nhanh mà vẫn có thể làm nên chuyện :smile:

Thêm Assembly vào kết quả so sánh nữa đi!

2 Likes

Để khi nào test thử xem, nhưng mình nghĩ ASM sẽ nhanh hơn C một chút, vì thấy nó “chân chất” lắm :smile:, nhưng viết thì hơi phức tạp :stuck_out_tongue_closed_eyes:

1 Like

Thời gian phát triển là thời gian để bạn thiết kế, viết code, kiểm thử và bảo trì ý mà (và cả phát triển thêm tính năng sản phẩm sau này nữa). Các ngôn ngữ động (dynamic) như python, ruby thường có thời gian phát triển một sản phẩm rất nhanh, đánh đổi lại là hiệu năng đôi khi chậm hơn 100 lần so với C, C++ và vài chục lần so với Java, C# (Trong trường hợp xấu nhất).

Nhưng thời gian thực thi thì do thằng CPU nó làm, cùng lắm là tốn… tiền điện, còn thời gian phát triển bạn phải đánh đổi bằng thời gian thực và chi phí thực của lập trình viên.

Trên thực tế, việc chậm hơn vài chục lần nghe có vẻ tệ, nhưng trong giai đoạn đầu phát triển thì vấn đề này không ảnh hưởng rõ rệt, khi đã đến một múc độ phát triển nhất định, có số lượng người dùng lớn, cần chú ý đến hiệu năng thực thi thì có thể tách một số module để viết trên các ngôn ngữ khác sau. Điển hình như youtube, họ xây dựng ban đầu trên python, bây giờ vẫn còn nhiều phần viết trên python và họ vẫn đảm bảo tốc độ cực kỳ tốt.

6 Likes

Cám ơn bạn nhé, mình cũng mường tượng ra nhưng nghe bạn giải thíhc thì hiểu rõ hơn nhiều :smiley:

3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?