• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

问个简单的问题“程序优化问题”

dos 2017-01-13 浏览量:959

如图所示:我今天在优化代码的时候发现一个问题,①为什么我用下面的for语句来代替会出现code增加三个字节?


②难道for中的i=0和i<5这个判断暂用空间多?

③假如我要学程序优化该看什么书好呢?

0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 其實要真的看ASM Code你才可以知道編譯器如何產出ASM Code,上面回答的是非常粗略的估計值,只是剛好而已

    我們就列上來看一下兩邊到底編譯出什麼東東,5行的程式碼部分ASM Code

    這樣共20行Instruction


    再來看for loop寫法

    這樣共26行


    您一定會覺得很奇怪,為什麼行數多反而較少,但我測試結果寫成for loop是比較少的,主要原因您是把這些assign放在else區塊裡面會有所不同

    所以我的Code占用3244是一個一個assign,3242是for loop寫法

    雖然51是8 Bit的,但這裡更正應該是CISC架構,所以Instruction有長有短,雖然多半是8 Bit

    您可以觀察到E4,FF這些是8Bit長度,但74AD是16Bit長度

    這些加總起來以後for loop還是比較省空間(0x918-0x8F3=37 Byte vs 0x8F2-0x8CB=39 Byte)

    另外兩者寫法未必for loop比較慢,還要端看一個Instruction需要幾個cycle,這裡再講下去就很多東西了...,若兩者空間都是足夠的,優先以易讀好維護的寫法(for loop),以上供參考


    • 发布于 2017-01-13
    • 举报
    • 评论 3
    • 2
    • 0
dos 回复了 MOP:都欺负我没学过汇编。我只掌握一门c,你却给我列出汇编叫我情何以堪。 回复
MOP 回复了 dos: 這才是標準答案阿^^,估計的答案很不準確的...您可以對照下面那位宣告成global和local的ASM Code差別 回复
dos 回复了 MOP:你这个ASM Code在哪里看的?我的keil4怎么看呢? 回复

其他答案 数量:5
  • 首先回答第一个问题,不同的编译器在汇编的过程中是不同的,赋值在keil编译过程中,汇编成四条指令,占用8个byte的指令空间,如mop大神的图中显示,也可能是3byte,直接操作data段,for循环涉及i变量的初始化赋值,3byte的指令空间,Seg【i+5】=seg【i】,比较跳转自增一共21byte指令空间,所以我的for循环一共是24byte,赋值过程是3*5=15byte,所以我的就多了9byte,如果赋值的多呢,比如10组,那么就是3*10=30byte,那么赋值的就多6byte啦,不同的编译器编译出来的不一定一样,在没有这样精确到字节的指令空间的问题,建议用for循环,综合来讲是省空间的。

    第二个问题,for循环中的i=0的初始化3byte,i++2byte,i<5的判断加跳转5byte,不见得用空间就多,还是刚才那句话,你要是循环100次,明显就减少了。

    第三个问题学程序优化的问题,这个几个字节尚且谈不上程序优化的问题,优化程序在于算法,无非就是时间换空间,空间换时间的问题,建议读一下《算法导论》这本书,上学的时候看过,感觉不错,前提是你的数学要过关

    • 发布于2017-01-13
    • 举报
    • 评论 3
    • 2
    • 0
dos 回复了 heaton426 :诶!苦逼的我,有个任务是把我的代码从8k左右精简到5k左右,但是我都从来没接触过这个东西。数学我感觉我有点基础,毕竟我大学高数没有听过课,期末考试我自己看两周就拿了78分,我觉得我有点基础 回复
heaton426 回复了 heaton426 :你现在什么样了,精简的如何了呢 回复
dos 回复了 heaton426 :诶!别提了,我现在都不知道从哪里下手,目前为止我才腾出225字节的空间。 回复

  • 很多人回答啊,程序优化是门学问
    • 发布于2017-01-15
    • 举报
    • 评论 0
    • 1
    • 0

  • 应该是for语句导致代码字数变多,可以试试先赋值一遍,然后再用for看看代码数量
    • 发布于2017-01-13
    • 举报
    • 评论 1
    • 0
    • 0
dos 回复了 afeiafei309 :我不怎么会用keil,就算赋值一遍又不能像下面那些大神一样能看到想要的结果,汇编这门课我没听过课 回复

  • 如图所示:我用for来代替①②③④⑤code可以减少28字节。但是我上一个图问题是,用for不但不减少code反而增加3个字节,之前是五行代码,现在for比五行代码少code不减小就算了为什么还要多出3个字节。就算多出的3个代码被i=0;i<5;和i++这三个条件各占用一个字节,那么for(){}跟五行代码暂用的rom大小一样?@MOP

    • 发布于2017-01-13
    • 举报
    • 评论 0
    • 0
    • 0

  • 1。for循环的三要素会导致最后增加3字节

    2.  程序的优化分两种

         如果你是想算法优化,时间复杂度空间复杂度等等,请参考《算法导论

         如果你是想做编译器优化,就是同样的代码怎么翻译成更少的字节数,请。。。。。。珍惜生命,不过中国需要你!

    • 发布于2017-01-13
    • 举报
    • 评论 2
    • 0
    • 0
dos 回复了 oceancjc :诶! 回复
dos 回复了 oceancjc :生命诚可贵,但为了理想可以考虑牺牲一下2333 回复

相关问题

问题达人换一批

问个简单的问题“程序优化问题”