パフォーマンスの問題

ジャンテルメ

私は時系列で作業してtype TSeries = [(Day, Double)]いますがDay、さらに処理するために最初の要素をDoubleに変換する必要があります(プロットなど)。

日付範囲を対応する倍精度範囲[lobound、upbound]にマッピングします。ここで、最も早い日付はloboundにマップされ、最も遅い日付はupboundにマップされます。これは基本的な変換です。それを実装するには、最初に日付範囲の最小値と最大値を取得する必要があります。パフォーマンスの問題が発生しましたが、正確な理由と修正方法がわかりません。

コードは次のとおりです(時系列はソートされているとは想定されていません)。

module Main where

import Data.Time (Day, fromGregorian, diffDays)

type TSeries = [(Day, Double)]

-- time-series to (Double, Double) mapping function
toDbl :: (Day -> Double) -> TSeries -> [(Double, Double)]
toDbl mapX ts = map (\(d,x) -> (mapX d, x)) ts

-- Day to Double mapping function - fast
mapDays1 :: (Day, Double) -> (Day, Double) -> Day -> Double
mapDays1 (d0,x0) (d1,x1) d = ((fromIntegral $ diffDays d d0) * x1 + (fromIntegral $ diffDays d1 d) * x0) / diff10
    where diff10 = fromIntegral $ diffDays d1 d0

-- Day to Double mapping function - slow
mapDays2 :: TSeries -> Double -> Double -> Day -> Double
mapDays2 ts x0 x1 d = mapDays1 (d0,x0) (d1,x1) d
    where d0 = minimum $ map fst ts
          d1 = maximum $ map fst ts

-- example time-series
func :: Int -> Double
func d = sin $ pi / 14 * (fromIntegral d)
ts = [(fromGregorian y m d, func d) | y <- [2000..2016], m <- [1..12], d <- [1..28]] :: TSeries

-- speed test
main = do
    let mindate = minimum $ map fst ts
        maxdate = maximum $ map fst ts
        test1 = toDbl (mapDays1 (mindate,0.0) (maxdate,100.0)) ts
        test2 = toDbl (mapDays2 ts 0.0 100.0) ts

    -- print $ sum $ map fst test1 -- this is fast
    print $ sum $ map fst test2 -- this is slow

私が実行するテスト(X軸、最初に要素を合計)は関係ありませんが、単純であり、パフォーマンスの問題をよく示しています。

基本的にmapDays1とmapDays2は同じですが、適切なスケーリングを取得するには、最小日付と最大日付を外部で計算してmapDays1に渡す必要がありますが、これはmapDays2内で「内部的に」行われます。

問題は、mapDays2がmapDays1バージョンと比較して非常に遅いことです。最小計算と最大計算が(1回ではなく)何度も呼び出されると思われますが、その理由がわかりません。また、mapDays2を修正してmapDays1と同様のパフォーマンスを得る方法がわかりません。

アレック

問題は確かにメモ化に関連しています。問題は、あなたが呼び出すことですmapDays1し、mapDays2それらのコールだけサンクを作成するので、すべての引数を渡すことはありません。

問題

サンクは唯一の内側に完了し得ることを意味することにmap別の呼び出しがするので、mapDays2その結果について共有することはできませんd0 = minimum $ map fst tsし、d1 = maximum $ map fst ts及び最大値と最小値のget再評価されるたびに一つはどこな状況を想像d0してd1、最後に依存しDay、正しくないだろう、その場合には、引数、ない再評価することd0d1するたびに。

対照的に、それは非常に明確でmindate = minimum $ map fst tsあり、maxdate = maximum $ map fst ts一度だけ計算する必要があります。

修正 mapDays2

f x y = eと同じふりをしたいのですがf x = \y -> e、ボンネットの下ではありません。最後の引数を除いてすべて渡されたときにGHCがサンクを作成しないようにする必要があります。d等号上に移動するだけです。次に、あなたが返す関数は一度だけ計算しますd0d1

-- Day to Double mapping function - slow
mapDays2 :: TSeries -> Double -> Double -> Day -> Double
mapDays2 ts x0 x1 = \d -> mapDays1 (d0,x0) (d1,x1) d
    where d0 = minimum $ map fst ts
          d1 = maximum $ map fst ts

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Rのループのパフォーマンスの問題

分類Dev

NestJsテストのパフォーマンスの問題

分類Dev

システムのパフォーマンスの問題

分類Dev

Pythonリスト操作のパフォーマンスの問題

分類Dev

iOSデバイスのパフォーマンスの問題

分類Dev

イオンタブのパフォーマンスの問題

分類Dev

イオンタブのパフォーマンスの問題

分類Dev

ループ内のjQueryパフォーマンスの問題

分類Dev

SSESIMDコードのパフォーマンスの問題

分類Dev

カーソルのパフォーマンス低下の問題

分類Dev

春の起動時のパフォーマンスの問題

分類Dev

matplotlibの凡例のパフォーマンスの問題

分類Dev

PageStorageKeyでのFlutterListViewのパフォーマンスの問題

分類Dev

VirtualBoxでのLinuxMintのパフォーマンスの問題

分類Dev

Burrows-PythonのWheelerのパフォーマンスの問題

分類Dev

Djangoの多対多のパフォーマンスの問題

分類Dev

SQLでのUNION句のパフォーマンスの問題

分類Dev

Where andContainsでのLINQtoEntitiesのパフォーマンスの問題

分類Dev

HikariCP での Postgresql のパフォーマンスの問題

分類Dev

スポックパフォーマンスの問題

分類Dev

ディスクI / Oパフォーマンスの問題

分類Dev

Retina Macbook ProでのWebGLパフォーマンスの問題

分類Dev

LinkedBlockingQueueでのJavaパフォーマンスの問題

分類Dev

Java ByteBufferのパフォーマンスの問題

分類Dev

RegexクエリのMongoDBパフォーマンスの問題

分類Dev

OnCreateViewHolderのパフォーマンスの問題

分類Dev

SpringバッチJPAItemReaderのパフォーマンスの問題

分類Dev

IE 11-DataTablesDOMのパフォーマンスの問題

分類Dev

SwiftUI-ObservableObjectのパフォーマンスの問題

Related 関連記事

  1. 1

    Rのループのパフォーマンスの問題

  2. 2

    NestJsテストのパフォーマンスの問題

  3. 3

    システムのパフォーマンスの問題

  4. 4

    Pythonリスト操作のパフォーマンスの問題

  5. 5

    iOSデバイスのパフォーマンスの問題

  6. 6

    イオンタブのパフォーマンスの問題

  7. 7

    イオンタブのパフォーマンスの問題

  8. 8

    ループ内のjQueryパフォーマンスの問題

  9. 9

    SSESIMDコードのパフォーマンスの問題

  10. 10

    カーソルのパフォーマンス低下の問題

  11. 11

    春の起動時のパフォーマンスの問題

  12. 12

    matplotlibの凡例のパフォーマンスの問題

  13. 13

    PageStorageKeyでのFlutterListViewのパフォーマンスの問題

  14. 14

    VirtualBoxでのLinuxMintのパフォーマンスの問題

  15. 15

    Burrows-PythonのWheelerのパフォーマンスの問題

  16. 16

    Djangoの多対多のパフォーマンスの問題

  17. 17

    SQLでのUNION句のパフォーマンスの問題

  18. 18

    Where andContainsでのLINQtoEntitiesのパフォーマンスの問題

  19. 19

    HikariCP での Postgresql のパフォーマンスの問題

  20. 20

    スポックパフォーマンスの問題

  21. 21

    ディスクI / Oパフォーマンスの問題

  22. 22

    Retina Macbook ProでのWebGLパフォーマンスの問題

  23. 23

    LinkedBlockingQueueでのJavaパフォーマンスの問題

  24. 24

    Java ByteBufferのパフォーマンスの問題

  25. 25

    RegexクエリのMongoDBパフォーマンスの問題

  26. 26

    OnCreateViewHolderのパフォーマンスの問題

  27. 27

    SpringバッチJPAItemReaderのパフォーマンスの問題

  28. 28

    IE 11-DataTablesDOMのパフォーマンスの問題

  29. 29

    SwiftUI-ObservableObjectのパフォーマンスの問題

ホットタグ

アーカイブ