2017-09-10 72 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。 –

相关问题