在Visual Studio 2012中,为什么此代码在交互模式下如此快速地执行,并且在作为控制台应用程序运行时如此缓慢?我有一台快速的计算机,但在运行时功能完成之前我可以数到4,在交互式工作室窗口中甚至不能达到1。
让我感到烦恼的另一部分是,当我测试其他人的Project Euler#4的F#代码时,它们都运行良好。所以它让我相信这段代码有一些不是最优的。 (它也是如此整洁干净>:P)
let reverse(digits:string) =
digits.ToCharArray() |> Array.rev |> System.String.Concat
let isPalindrome(number:int) =
let text = number.ToString()
if text.Length % 2 = 0 then
text = reverse(text)
else
false
let palindromes(floor:int, ceiling:int) =
seq {
for i1 = floor to ceiling do
for i2 = floor to ceiling do
let result = i1 * i2
if isPalindrome result then
yield result
}
let run =
palindromes(100, 999)
|> Seq.max
概要
为了后人,我将列出最有效的性能变化。
它仍然无法解释我的原始问题。但现在它可以忽略不计,很难说服自己花更多的时间在上面。我感谢大家的投入。谢谢!
答案 0 :(得分:6)
如果您在发布模式下编译项目(Optimize code
选项已打开),您几乎看不到运行程序和在F#Interactive中执行的区别。
如果您已阅读其他人的版本,则可以看到可以直接在数字上检查isPalindrome
。但是,快速修复仍然使用String
:
let reverse(digits:string) =
System.String (digits.ToCharArray() |> Array.rev)
请注意,与String构造函数调用相比,字符串连接速度较慢。
正如@wsanville所说,奇数长度也可能是回文:
let isPalindrome(number:int) =
let text = number.ToString()
text = reverse(text)
在palindromes
函数中,从i2
开始迭代i1
可以将执行时间缩短一半:
let palindromes(floor:int, ceiling:int) =
seq {
for i1 = floor to ceiling do
for i2 = i1 to ceiling do
let result = i1 * i2
if isPalindrome result then
yield result
}
let run =
palindromes(100, 999)
|> Seq.max
通过这些简单的优化,您的代码在我的机器上运行速度提高了5倍。
答案 1 :(得分:0)
问题很陈旧,我之前遇到同样的问题
F#(或任何F#应用程序)中的控制台应用程序在执行期间加载“Fsharp.Core.dll”文件, 因此,为了获得更快的exe文件,请执行以下操作。
1.)使用“发布”模式构建,(比如Hello.exe)
2.)将文件“Fsharp.Core.dll”合并到您的exe文件中 使用ILMERGE(http://www.microsoft.com/en-us/download/details.aspx?id=17630)
- 打开命令提示符和CD到“释放文件夹”
ILMERGE Hello.exe Fsharp.Core.dll /out:Hello2.exe
尝试运行Hello2.exe,并检查它是否加载速度更快。