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を削除し、代わりに新しい文字列を作成します。
  • それらすべてを収集するのではなく、最大の回文のみを保持する
  • 文字列バージョンのreverseを計算リバースに置き換える

それはまだ私の元の問題を説明していません。しかし、今ではごくわずかであり、これ以上時間を費やすように自分を納得させるのは難しいです。皆様のご意見に感謝いたします。ありがとう!

4

2 に答える 2

6

リリース モード (Optimize codeオプションをオン) でプロジェクトをコンパイルすると、プログラムの実行と F# Interactive での実行の違いはほとんどわかりません。

他の人のバージョンを読んだことがある場合はisPalindrome、数値に対して直接チェックを行うことができることがわかります。ただし、まだ使用している簡単な修正String

let reverse(digits:string) = 
     System.String (digits.ToCharArray() |> Array.rev)

文字列の連結は、文字列コンストラクターの呼び出しに比べて遅いことに注意してください。

@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" ファイルを読み込みます。

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 に答える