2013-04-12 125 views
5

我對解決這個SPOJ問題 - http://www.spoj.com/problems/ALICESIE/BASH很慢嗎?

的問題歸結爲打印什麼(N + 1)/ 2

這是通過在0.03秒

#include <stdio.h> 
    int main() { 
     int test, n; 
     scanf("%d", &test); 
     while(test--) { 
      scanf("%d", &n); 
      printf("%d\n", (n + 1) >> 1); 
     } 
     return 0; 
    } 

我的C代碼而這是我的BASH代碼這給時間超出限制(即> 1秒)

read test 
while ((test--)) 
do 
    read n 
    echo "$(((n+1)/2))" 
done 

任何人都可以讓我知道爲什麼會出現這種情況? BASH很慢嗎? 謝謝。

+1

只是好奇你爲什麼你沒有在你的bash代碼中使用while循環,就像你在C代碼中做的那樣?語法幾乎相同:'while((test--))'(這只是一個非常小的一點點,但至少看起來是一致的) – William

+0

done.no區別雖然 - 仍然TLE –

+0

@ user1972269顯示你如何調用你的bash代碼。 – kojiro

回答

2

您正在比較編譯代碼和腳本語言(Bash)。

Bash腳本總是比編譯代碼慢,因爲它們需要被解釋。如你所知,爲了運行用C語言編寫的代碼,你首先需要編譯它。當涉及Bash腳本時,您不必閱讀它,代碼只是「即時閱讀」。所以Bash比C慢。

+0

>>謝謝!但是,我的許多BASH代碼(在線評委的不同程序中)在時限內通過。如果沒有人能夠使用該語言提交解決方案,他們不會將語言設置爲特定問題。 –

+0

這可能是間接的,也許由於某種原因,在您的機器上執行時間較慢,或者他們使用不同的入口數據,這就是爲什麼他們實現較少的計算時間。 – MMM

3

Bash在執行數字運算上很慢。但這不是Bash的設計目的。

Bash是很快快速掀起一個腳本來自動化一些重複動作。修改錯誤的Bash腳本並再次運行它很快。快速找出Bash腳本究竟在做什麼(而不是尋找你正在查看的C可執行文件的源代碼)。

而且名單還在繼續。

C和Bash是語言和環境的兩種截然不同的品種。如果你抱怨Bash速度緩慢,你就會用它來解決這類問題。

「不要抱怨螺絲刀在把釘子刺入牆壁時會吮吸。」

+0

>>謝謝!但是我的許多BASH代碼(在線評委的不同程序中)都會在限定時間內通過。如果沒有人可以使用該語言提交解決方案,他們不會將語言設置爲特定問題。 –

2

由於其他答案中給出的原因,Bash比C慢,但這並不能解釋這裏發生了什麼。我懷疑你讓你的一個read永遠掛起,直到超時。當我實現這個:

#!/bin/bash 

main() { 
    local test 
    local i 
    local n 
    read test 
    for ((i=$test; i>0; i--)); do 
     read n 
     echo "$(((n+1)/2))" 
    done 
} 

time { 
    echo 1000 
    printf '%d\n' {1002..2} 
} | main 

它並不需要很多的時間:

real 0m0.033s 
user 0m0.029s 
sys 0m0.013s 

您可以強制read發言超時自己與-t標誌read,就像這樣:

main() { 
    local test 
    local i 
    local n 
    read -t.3 test 
    if [[ -z $test ]]; then 
     echo "Failed to read a test value within 300ms." 
     return 1 
    } 
    for ((i=$test; i>0; i--)); do 
     read -t.3 n 
     if [[ -z $n ]]; then 
      echo "Failed to read a value for n within 300ms." 
      return 1 
     } 
     echo "$(((n+1)/2))" 
    done 
} 
+0

雅,我知道它不會花費太多時間,但我不會看到永遠掛着。 –

+0

@ user1972269嘗試向您的讀命令添加超時標誌('-t')。 – kojiro

+0

>>如何添加? –