我一直在挖掘Linux内核的某些部分,发现这样的调用:
if (unlikely(fd < 0))
{
/* Do something */
}
Run Code Online (Sandbox Code Playgroud)
要么
if (likely(!err))
{
/* Do something */
}
Run Code Online (Sandbox Code Playgroud)
我找到了它们的定义:
#define likely(x) __builtin_expect((x),1)
#define unlikely(x) __builtin_expect((x),0)
Run Code Online (Sandbox Code Playgroud)
我知道它们是为了优化,但它们是如何工作的?使用它们可以预期性能/尺寸减少多少?至少在瓶颈代码中(当然在用户空间中)是否值得麻烦(并且可能失去可移植性).
我最近写了一段像这样的C代码:
static void func1()
{
}
static void func2()
{
}
typedef void (*func_t)(void);
const func_t lookUpTable[FUNC_COUNT] =
{
[FUNC1] = &func1,
[FUNC2] = &func2
}
Run Code Online (Sandbox Code Playgroud)
另一个程序员在同一个文件上工作并将其更改为:
static void func1();
static void func2();
typedef void (*func_t)(void);
const func_t lookUpTable[FUNC_COUNT] =
{
[FUNC1] = &func1,
[FUNC2] = &func2
}
static void func1()
{
}
static void func2()
{
}
Run Code Online (Sandbox Code Playgroud)
由于funcN函数只通过查询表调用,我实际上并不需要这些函数的声明.
这是一个品味问题,还是一种被认为是好/坏做法的编码风格?
谢谢你的回答!
哪种更有效的调度方法可以使我的fetch-decode-execute次数更快一点?
为简单起见,我将其保持在最低限度,就像操作在1字节操作数上操作一样,例如只有两个操作数.
我现在使用的方法(简化)是:
typedef unsigned char byte;
vector<byte> _program = { INST::PUSH, 32, INST::POP};
enum INST {
PUSH =0, /*index=0*/
POP =1, /*index=1*/
}
//DISPATCHING METHOD #1
switch (curr_instruction) {
case INST::PUSH: {
/*declared inline*/ _push_to_stack(_program[instr_ptr+1]);
}
case INST::POP: {
/*declared inline*/ _pop_stack();
}
}
Run Code Online (Sandbox Code Playgroud)
或者使用函数指针表来执行'program'中的每条指令(vector/vector _program),如下所示:
typedef void (*voidptr)();
void hndl_push(){
/*declared inline*/ _push_to_stack(_program[instr_ptr+1]);
}
void hndl_push(){
/*declared inline*/ _pop_stack();
}
funcptr handlers[2] = {&hndl_push /*index=0*/, & hdnl_pop /*index=1*/}'
vector<byte> _program = { INST::PUSH, 32, INST::POP};
size_t …Run Code Online (Sandbox Code Playgroud) c++ performance assembly compiler-optimization vm-implementation
函数指针数组是否能够通过删除分支来提高性能?
是
(function[number])();
Run Code Online (Sandbox Code Playgroud)
比...快
if(number == 0)
function1();
else if (number == 1)
function2();
Run Code Online (Sandbox Code Playgroud)
为了表现?(假设这是非常性能关键的代码)
编辑:数字是0或1(否则使用,因为它应该只有0或1)
我有一些像这样的代码:
while(window.pollEvent(event) {
//checking events...
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,我应该使用switch语句:
switch(event.type) {
case sf::Event::Closed:
window.close();
break;
case sf::Event::KeyPressed:
//...
break;
}
Run Code Online (Sandbox Code Playgroud)
或if-else声明:
if(event.type == sf::Event::Closed)
window.close();
else if(event.type == sf::Event::KeyPressed)
//...
Run Code Online (Sandbox Code Playgroud)
在SFML中哪个更快,而在其他方面更具可读性?
c++ ×3
assembly ×1
c ×1
declaration ×1
gcc ×1
if-statement ×1
linux ×1
linux-kernel ×1
optimization ×1
performance ×1