2017-09-10 71 views
1

我已經開始從python翻譯我發明的桌面遊戲的遊戲引擎。我知道我將要展示的這個例子非常沒有意義,並沒有真正需要對其進行優化,但我希望在處理繁重的功能之前先解決這個問題。Julia需要多長時間才能獲得最佳性能?

function howMany()::Int8 
    pieces::Int8 = 0 
    while pieces > 8 || pieces < 4 
     try 
      print("How many pieces are we going to play with (min 4, max 8)? ") 
      pieces = parse(Int8, readline(STDIN)) 
     catch 
      println("It must be an integer number between 4 and 8!") 
     end 
    end 
    return pieces 
end 

function main() 
    pieces::Int8 = howMany() 
    #println(pieces, typeof(pieces)) 
end 

main() 

是否需要聲明Int8 4次(3聲明+解析參數)? 什麼時候可以避免指定Int8而沒有任何性能折衷?

+1

@DanGetz提供了一個很好的答案。我想我只是補充一點,我個人更喜歡在函數簽名中包含類型信息,例如'myfunc(x :: Float64):: Int',*儘管通常不需要這樣做來獲得類型穩定的代碼*。原因是當你回來查看6個月後的代碼時,它使生活變得更容易,再加上從調試的角度來看,它可以使生活變得更容易(例如,如果你嘗試將錯誤的類型提供給功能或改變功能,並意外輸出錯誤的類型) –

回答

4

兩次在下面避免了昂貴的try-catch

function howMany() 
    while true 
     print("How many pieces are we going to play with (min 4, max 8)? ") 
     pieces = get(tryparse(Int8, readline(STDIN)), Int8(0)) 
     4 <= pieces <= 8 && return pieces 
     println("It must be an integer number between 4 and 8!") 
    end 
end 

function main() 
    pieces = howMany() 
    println(pieces, typeof(pieces)) 
end 

main() 

採用漂亮的捷徑,如:

  • get默認

  • 短路&&,而不是笨重的if ... end

它代碼穩定,如@code_warntype howMany()所示。

+0

謝謝!那麼,你是否告訴我,由於函數總是返回一個相同類型的值,所以沒有必要將':: Int8'添加到'pieces'(兩次)或'howMany()'(性能明智的請講)? – Pigna

+1

沒錯。記住這一點總是很好的,一旦編譯完成,所有東西都會打印出來。因此,遺漏類型使得編譯器不得不考慮它們,並且Julia的類型推斷足夠體面以知道'howMany()'返回一個Int8,在'pieces = someInt8'之後,那麼'pieces'就是一個Int8。 –

相關問題