ios 内联函数 inline ---分解LFLiveKit


/*
 内联函数:用 inline 关键字修饰的函数。内联函数不是在函数调用时发生控制转移,类似于《宏》在编译时将函数体替换每一个调用的代码位置。
 
 相较于普通函数:
 1、普通函数(没有inline修饰)汇编时会出现Call指令,而调用Call指令需要
 2、函数之间的调用实则内存地址之间的调用,当函数调用执行完毕后会返回到原来执行函数的地址,所有函数调用有一定的时间开销。
    内联函数减少了调用开销,提高了效率(执行速度较普通函数快一些)
 3、集成了宏的优点(函数支持用宏代码替换)
 
 相较于宏:
 1、避免了宏需要的预编译,inline修饰的函数也是函数,不需要预编译
 2、可以使用当前类的私有成员@private及保护成员@protected
 3、在调用一个内联函数时会对参数进行校验,保证调用正确。
 
 看一个问题分两面:
 1、内联函数只是我们向编译器提供的申请,编译器不一定采用inline的形式调用
 2、内联函数无法承载大量、复杂代码,否则有可能抵消高效率的好处
 3、内联函数你不允许使用循环语句和开关 (for、while等)
 4、内联函数必须定义在调用之前
 
 */

inline static NSString *formatedSpeed(float bytes, float elapsed_milli) {
    if (elapsed_milli <= 0) {
        return @"N/A";
    }

    if (bytes <= 0) {
        return @"0 KB/s";
    }

    float bytes_per_sec = ((float)bytes) * 1000.f /  elapsed_milli;
    if (bytes_per_sec >= 1000 * 1000) {
        return [NSString stringWithFormat:@"%.2f MB/s", ((float)bytes_per_sec) / 1000 / 1000];
    } else if (bytes_per_sec >= 1000) {
        return [NSString stringWithFormat:@"%.1f KB/s", ((float)bytes_per_sec) / 1000];
    } else {
        return [NSString stringWithFormat:@"%ld B/s", (long)bytes_per_sec];
    }
}
    NSLog(@"debugInfo uploadSpeed: %@", formatedSpeed(debugInfo.currentBandwidth, debugInfo.elapsedMilli));

参考:

https://www.jianshu.com/p/d557b0831c6a

https://www.cnblogs.com/iosshare/archive/2016/05/11/5483330.html