/* 内联函数:用 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