打Log是我們debug時最簡單樸素的方法,NSLog對于objc開發(fā)就像printf對于c一樣重要。但在使用NSLog打印大量Log,尤其是在游戲開發(fā)時(如每一幀都打印數據),NSLog會明顯的拖慢程序的運行速度(游戲幀速嚴重下滑)。本文探究了一下NSLog如此之慢的原因,嘗試使用lldb斷點調試器解決DebugLog問題。
基本上這種事情一定可以在Apple文檔中找到,看NSLog的文檔,第一句話就說:Logs an error message to the Apple System Log facility.,所以首先,NSLog就不是設計作為普通的debug log的,而是error log;其次,NSLog也并非是printf的簡單封裝,而是Apple System Log(后面簡稱ASL)的封裝。
大概就是個系統(tǒng)級別的log工具吧,syslog的替代版,提供了一系列強大的log功能。不過一般我們接觸不到,NSLog就對它提供了高層次的封裝
意識大概是說,NSLog會向ASL寫log,同時向Terminal寫log,而且同時會出現在Console.app中(Mac自帶軟件,用NSLog打出的log在其中全部可見);不僅如此,每一次NSLog都會新建一個ASL client并向ASL守護進程發(fā)起連接,log之后再關閉連接。所以說,當這個過程出現N次時,消耗大量資源導致程序變慢也就不奇怪了。
NSLog有這樣的消耗問題,那該怎么辦呢?
拒絕殘留的Log?,F在項目都是多人共同開發(fā),我們應該只把Log作為錯誤日志或者重要信息的日志使用,commit前請把自己調試的log去掉(尤其是在循環(huán)里寫log的小伙伴,簡直不能一起快樂的玩耍了)
release版本中消除Log。debug歸debug,再慢也不能波及到release版本,用預編譯宏過濾下就好。
是時候換個Log系統(tǒng)了,如CocoaLumberjack,自建一個簡單的當然也挺好(其實為了項目需要自己也寫了個小log系統(tǒng),實現可以按名字和級別顯示log和一些擴展功能,以后有機會分享下)
NSLog耗費比較大的資源
NSLog被設計為error log,是ASL的高層封裝
在項目中避免提交commit自己的Debug log,release版本更要注意去除NSLog,可以使用自建的log系統(tǒng)或好用的log系統(tǒng)來替代NSLog
debug不應只局限于log滿天飛,lldb斷點調試是一個優(yōu)秀的debug方法,需要再深入研究下