小编Phi*_*lip的帖子

功能中的过早返回效率

这是我作为一个经验不足的程序员经常遇到的情况,我特别想知道我正在努力优化的一个雄心勃勃,速度密集的项目.对于主要的类C语言(C,objC,C++,Java,C#等)及其常用的编译器,这两个函数是否同样有效运行?编译代码有什么区别吗?

void foo1(bool flag)
{
    if (flag)
    {
        //Do stuff
        return;
    }

    //Do different stuff
}

void foo2(bool flag)
{
    if (flag)
    {
        //Do stuff
    }
    else
    {
        //Do different stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

基本上,是否有提前breakreturn早期的直接效率奖金/罚款?堆栈框架是如何涉及的?是否有优化的特殊情况?是否有任何因素(如内联或"Do stuff"的大小)可能会对此产生重大影响?

我总是支持改进可读性而非次要优化(我通过参数验证看到foo1很多),但这种情况经常发生,我想一劳永逸地抛开所有的担忧.

而且我知道过早优化的陷阱......呃,这些都是一些痛苦的回忆.

编辑:我接受了答案,但EJP的答案非常简洁地解释了为什么使用a return几乎可以忽略不计(在汇编中,return在函数末尾创建一个'分支',这非常快.分支改变了PC寄存器和也可能会影响缓存和管道,这是非常小的.)特别是对于这种情况,它实际上没有区别,因为它们if/elsereturn函数末尾都创建了相同的分支.

c c# c++ java compiler-optimization

96
推荐指数
5
解决办法
3976
查看次数

泛型和通配符:Java喜欢"new Foo <Bar <?>>"

好吧,所以Java不允许以下内容:

Foo<?> hello = new Foo<?>();
Run Code Online (Sandbox Code Playgroud)

这是有道理的 - 毕竟,如果你只是想打包/拆箱一切,那么仿制药有什么意义呢?

奇怪的是,Java 确实允许这样做:

Foo<Bar<?>> howdy = new Foo<Bar<?>>();
Run Code Online (Sandbox Code Playgroud)

当然,这实际上可以实现更多,但在某些时候,会有一个演员来获得任何Bar合作.但是如果Java有一定的特殊性,为什么它不允许这样做?:

Foo<? extends Mal> bonjour = new Foo<? extends Mal>();
Run Code Online (Sandbox Code Playgroud)

我问的唯一原因是我正在修复依赖于"构造函数的类参数中的通配符",并且非常想知道它背后的含义/意图.

编辑:澄清我的问题,这些陈述允许/不允许的理由是什么?我知道"Java不允许在构造函数中使用通配符",但问题是,为什么这些奇怪呢?如果嵌套通配符可以,为什么不允许有界通配符?

java generics

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

快速计算数组中零值字节的数量

什么是计算大型连续数组中零值字节数的快速方法?(或者相反,非零字节的数量.)大,我的意思是2 16字节或更大.数组的位置和长度可以包含任何字节对齐.

天真的方式:

int countZeroBytes(byte[] values, int length)
{
    int zeroCount = 0;
    for (int i = 0; i < length; ++i)
        if (!values[i])
            ++zeroCount;

    return zeroCount;
}
Run Code Online (Sandbox Code Playgroud)

对于我的问题,我通常只是zeroCount根据具体的更改维护和更新它values.但是,我希望zeroCount在发生任意批量更改后,有一种快速,通用的重新计算方法values.我确信有一种比较快速的方法可以更快地实现这一点,但是,唉,我只是一个新手twiddler.

编辑: 一些人已经询问数据的性质是零检查,所以我将描述它.(不过,如果解决方案仍然普遍,那就太好了.)

基本上,设想一个由体素组成的世界(例如Minecraft),将程序生成的地形分隔成立方块,或者将有效的内存页面编入索引为三维数组.每个体素都是飞行加权,作为对应于独特材料(空气,石头,水等)的唯一字节.许多块仅包含空气或水,而其他块包含大量2-4种体素(污垢,沙子等)的不同组合,有效地2-10%的体素是随机异常值.大量存在的体素往往沿着每个轴高度聚集.

但是,似乎零字节计数方法在许多不相关的场景中都很有用.因此,需要一般的解决方案.

c c++ bit-manipulation

7
推荐指数
2
解决办法
2582
查看次数

KVO和核心数据,通过观察获得变化的价值观

所以我对Core Data和KVO相当新,但我有一个NSManagedObject子类,它成功地观察了它自己的to-many关系.问题是,在观察到的变化时,我想迭代添加或删除的一组对象.有没有办法直接访问这些项目?或者我必须做一些相对低效的事情:

NSSet* newSet = (NSSet*)[change objectForKey:NSKeyValueChangeNewKey];
NSSet* oldSet = (NSSet*)[change objectForKey:NSKeyValueChangeOldKey];

NSMutableSet* changedValues = [[NSMutableSet alloc] initWithSet:newSet];
[changedValues minusSet:oldSet];
Run Code Online (Sandbox Code Playgroud)

我觉得你应该能够避免这种情况,因为在这些消息中......

[self willChangeValueForKey:forSetMutation:usingObjects:];
[self  didChangeValueForKey:forSetMutation:usingObjects:];
Run Code Online (Sandbox Code Playgroud)

你正在处理添加/删除的对象!也许知道这些物体会发生什么会有所帮助?

core-data objective-c key-value-observing nsset

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

是否有适用于iOS4和Xcode4的BDD解决方案?

因此,我一直在努力寻找适用于iOS4和Xcode4的可靠BDD替代方案,但是很久以前所有东西都要么已经被废弃,要么已经完成了工作,而是相当混乱.我发现最好的解决方案被称为雪松(主要文章有一个链接到最近更新的项目跟踪器),但它与Xcode4涉及凌乱解决一些问题,如注意这里.有谁知道更好的解决方案?谢谢!

编辑:我决定使用OCUnit并将BDD语法转换为测试名称.这不是我理想的解决方案,特别是因为所有测试名称都必须以"test"(ERRGGHH !!!)为前缀,但我根本无法让Cedar为我的生活工作.OCHamcrest(一个流行的匹配库)使得这个MUCH更容易忍受,但允许UI测试的东西,不能直接编译到你的代码中,是在Objective-C中,并且可以在Xcode中使用仍然绝对是美味的.

bdd objective-c ios4 xcode4

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