Is BASH very slow?

后端 未结 4 1857
时光取名叫无心
时光取名叫无心 2021-01-18 03:14

I was solving this question on SPOJ - http://www.spoj.com/problems/ALICESIE/

What the question boils down to print (n+1)/2

This is my C code which passes in

4条回答
  •  栀梦
    栀梦 (楼主)
    2021-01-18 03:54

    Bash is slower than C, for sure, because of the reasons given in other answers, but that doesn't explain what's happening here. I suspect you're letting one of your reads hang forever, until timeout. When I implement this:

    #!/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
    

    It doesn't take very much time:

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

    You can force the read statements to time out on their own with the -t flag to read, like this:

    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
    }
    

提交回复
热议问题