Ticket #1094 (closed feature request: duplicate)

Opened 6 years ago

Last modified 5 years ago

loop optimization by removing constants

Reported by: Azmo Owned by:
Priority: normal Milestone: 6.8.1
Component: Compiler Version: 6.6
Keywords: loop constants optimization Cc:
Operating System: Unknown/Multiple Architecture: Unknown/Multiple
Type of failure: Difficulty: Unknown
Test Case: Blocked By:
Blocking: Related Tickets:

Description

the current version of Data.List.foldl' is:

foldl'           :: (a -> b -> a) -> a -> [b] -> a
foldl' f a []     = a
foldl' f a (x:xs) = let a' = f a x in a' `seq` foldl' f a' xs

which for some reason is faster if removing the first parameter, e.g:

foldl2'           :: (a -> b -> a) -> a -> [b] -> a
foldl2' f = loop
  where loop a []     = a
        loop a (x:xs) = let a' = f a x in a' `seq` loop a' xs


Testing speed difference:

module Main (main) where

import System (getArgs)

sumFoldl' :: Int -> Int
sumFoldl' n = foldl' (+) 0 [1..n]

sumFoldl2' :: Int -> Int
sumFoldl2' n = foldl2' (+) 0 [1..n]

-- copy of Data.List.foldl'
foldl'           :: (a -> b -> a) -> a -> [b] -> a
foldl' f a []     = a
foldl' f a (x:xs) = let a' = f a x in a' `seq` foldl' f a' xs

-- altered version of foldl'
foldl2'           :: (a -> b -> a) -> a -> [b] -> a
foldl2' f = loop
  where loop a []     = a
        loop a (x:xs) = let a' = f a x in a' `seq` loop a' xs

main = do
  [v,n] <- getArgs
  case v of
    "1" -> print (sumFoldl' (read n))
    "2" -> print (sumFoldl2' (read n))


I have no idea how the optimization of loops is done, but the request is that this kind of loop rewriting should be done by the compiler, not by the user (to get a faster loop). It seems to just be a matter of finding and removing constants (identifiers just passed along).

Change History

Changed 6 years ago by kirsten

The optimization you suggest is called the "static argument transformation". There's already a ticket to implement it at:  http://hackage.haskell.org/trac/ghc/ticket/888

and if you're interested, there's an explanation there of why this isn't easy.

Changed 6 years ago by simonpj

  • status changed from new to closed
  • resolution set to duplicate

Indeed. I've copied the example over to #888 (always good to have more examples), and am closing this one.

Simon

Changed 6 years ago by igloo

  • milestone changed from 6.8 branch to 6.8.1

Changed 5 years ago by simonmar

  • architecture changed from Multiple to Unknown/Multiple

Changed 5 years ago by simonmar

  • os changed from Multiple to Unknown/Multiple
Note: See TracTickets for help on using tickets.