相关疑难解决方法(0)

我们还应该优化"小"吗?

我正在改变我的for循环以增加使用++i而不是i++思考,这是否真的有必要了?当然,今天的编译器会自行完成这项优化.

在本文中,http://leto.net/docs/C-optimization.php,从1997年开始迈克尔·李进入其他优化,如内联,循环展开,循环干扰,循环反转,强度降低等等.这些仍然相关吗?

我们应该进行哪些低级代码优化,以及我们可以安全地忽略哪些优化?

编辑:这与过早优化无关.已经做出了优化的决定.现在问题是什么是最有效的方法.

轶事:我曾经审查了一个要求规范:"程序员应该离开一个而不是乘以2".

c c++ optimization

16
推荐指数
7
解决办法
2605
查看次数

CPU依赖代码:如何避免函数指针?

我有为多个CPU编写的性能关键代码.我在运行时检测CPU,并根据检测到的CPU使用适当的函数.所以,现在我必须使用函数指针并使用这些函数指针调用函数:

void do_something_neon(void);
void do_something_armv6(void);

void (*do_something)(void);

if(cpu == NEON) {
    do_something = do_something_neon;
}else{
    do_something = do_something_armv6;
}

//Use function pointer:
do_something(); 
...
Run Code Online (Sandbox Code Playgroud)

这并不重要,但我会提到我已经针对不同的cpu优化了功能:armv6和armv7以及NEON支持.问题是通过在许多地方使用函数指针,代码变得更慢,我想避免这个问题.

基本上,在加载时,链接器使用函数地址解析relocs和patch代码.有没有办法更好地控制这种行为?

就个人而言,我提出了两种避免函数指针的方法:为cpu依赖函数创建两个独立的.so(或.dll),将它们放在不同的文件夹中,并根据检测到的CPU将这些文件夹中的一个添加到搜索路径中(或者LD_LIB_PATH).加载主代码和动态链接器将从搜索路径中获取所需的dll.另一种方法是编译两个独立的库副本:)第一种方法的缺点是它迫使我至少有3个共享对象(dll):两个用于cpu依赖函数,一个用于使用它们的主代码.我需要3,因为在加载使用这些cpu相关函数的代码之前,我必须能够进行CPU检测.关于第一种方法的好处是应用程序不需要为多个CPU加载相同代码的多个副本,它将仅加载将使用的副本.第二种方法的缺点是非常明显的,不需要谈论它.

我想知道是否有办法在不使用共享对象的情况下执行此操作并在运行时手动加载它们.其中一种方法是涉及在运行时修补代码的一些hackery,它可能太复杂而无法正确完成它).有没有更好的方法来控制加载时的重定位?也许将cpu依赖函数放在不同的部分,然后以某种方式指定哪个部分具有优先级?我认为MAC的男子气概有类似的东西.

ELF-only(针对手臂目标)解决方案对我来说已经足够了,我并不真正关心PE(dll's).

谢谢

c cpu arm elf ld

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

标签 统计

c ×2

arm ×1

c++ ×1

cpu ×1

elf ×1

ld ×1

optimization ×1