小编Mat*_*čík的帖子

为什么`filterM + mapM_` 比`mapM_ + when` 慢这么多,列表很大?

我不太了解 Haskell 优化在内部是如何工作的,但我一直在使用过滤器,希望它们被优化为与 C++ 中的简单 if 等效的东西。例如

mapM_ print $ filter (\n -> n `mod` 2 == 0) [0..10]
Run Code Online (Sandbox Code Playgroud)

将编译成相当于

for (int i = 0; i < 10; i++)
    if (i%2 == 0)
        printf("%d\n", i);
Run Code Online (Sandbox Code Playgroud)

对于长列表(10 000 000 个元素),基本列表似乎是正确的,filter但如果我使用 monadic ,则存在巨大差异filterM。我为此速度测试编写了一段代码,很明显,filterM使用when.

import Data.Array.IO
import Control.Monad
import System.CPUTime

main :: IO ()
main = do
  start <- getCPUTime
  arr <- newArray (0, 100) 0 :: IO (IOUArray Int Int)
  let
    okSimple i = …
Run Code Online (Sandbox Code Playgroud)

monads optimization performance haskell io-monad

5
推荐指数
1
解决办法
127
查看次数

iOS:UIDynamicAnimator updateItemUsingCurrentState不使用旋转

我正在尝试手动更改UIDynamics视图的旋转,但视图的旋转始终在更新后重置.该文件说,该UIDynamicAnimatorupdateItemUsingCurrentState:方法应该更新项目的位置和旋转,而只是位置更新.
我创建了一个简短的示例,其中方形视图从屏幕上掉落,触摸后应将其定位到触摸位置并旋转到45度.但是,不会发生旋转(有时可以看到旋转几分之一秒,但之后会再次重置):

#import "ViewController.h"

@interface ViewController ()
{
    UIDynamicAnimator* _animator;
    UIView* _square;
}
@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    _square = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
    _square.backgroundColor = [UIColor grayColor];
    [self.view addSubview:_square];

    _animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view];
    UIGravityBehavior *gravityBehavior = [[UIGravityBehavior alloc] initWithItems:@[_square]];
    gravityBehavior.magnitude = 0.1;
    [_animator addBehavior:gravityBehavior];
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [[event allTouches] anyObject];
    _square.center = [touch locationInView:self.view];
    NSLog(@"transform before rotation: %@", …
Run Code Online (Sandbox Code Playgroud)

objective-c ios ios7 uikit-dynamics

1
推荐指数
1
解决办法
1485
查看次数