0

在 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

概括

为了后代,我将列出最有效的性能变化。

  • 删除 Concat 并创建一个新字符串。
  • 只保留最大的回文而不是收集所有回文
  • 用计算反向替换字符串版本的反向

它仍然没有解释我原来的问题。但现在它是如此微不足道,很难说服自己再花时间在上面。我感谢大家的意见。谢谢!

4

2 回答 2

6

如果您在 Release 模式下编译项目(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迭代减少一半:i2i1

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 倍。

于 2013-01-10T08:14:22.943 回答
0

这个问题很老了,我以前也有同样的问题

F#(或任何 F# 应用程序)中的控制台应用程序在执行期间加载“Fsharp.Core.dll”文件,因此为了获得更快的 exe 文件,请执行以下操作。

1.)使用“发布”模式构建,(比如 Hello.exe)

2.) 使用 ILMERGE ( http://www.microsoft.com/en-us/download/details.aspx?id=17630 )将文件“Fsharp.Core.dll”合并到您的 exe 文件中

- 打开命令提示符和 CD 到“发布文件夹”

ILMERGE Hello.exe Fsharp.Core.dll /out:Hello2.exe

尝试运行 Hello2.exe,并检查它是否加载更快。

于 2013-10-29T07:08:50.107 回答