[問題] C的兩種寫法結果不同?

看板C_and_CPP作者 (mirror)時間12年前 (2012/03/24 22:17), 編輯推噓5(5041)
留言46則, 10人參與, 最新討論串1/1
如題~~ 目前我有一個程式需更改~所以我用了另一個寫法~ 但我兩種寫法明明就是在講一樣的東西~ 但我跑兩者的performance(跑很多個loop平均算他的錯誤率)就是會不一樣~ (由於我跑錯誤率需要跑超多loop~所以我debug僅能printf幾次來看這兩種寫法是否相同~ 兩種寫法printf出來的東西是一樣的) <寫法1> for(i=2;i<N;i++) { if(i==2) { delta_a[i]=delta_Tx1*Rtilde_Real[i][i]; } else { delta_a[i]=delta_a[i-1]*Rtilde_Rea[i-1][i-1]*Rtilde_Real[i][i]; } } <寫法2> delta_a[2]=delta_Tx1*Rtilde_Real[2][2]; delta_a[3]=delta_a[2]*Rtilde_Real[2][2]*Rtilde_Real[3][3]; 兩者好像是講一樣的東西~ 但跑很多loop來算performance就是會不一樣~ 我很確定我程式中的差異就在這兩種的差別而已~ 不知道是C內部有無特殊的規定還是我犯的問題其實很蠢~ 若這問題有點笨~還請版上高人指點我~ 若回答有點長~歡迎站內信指點迷津Orz 附上程式碼 : http://codepad.org/DkFsuCkd 其於部分不用管他~差別僅在於<寫法1>和<寫法2>跑出來結果不同而已~ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.114.15.28

03/24 22:19, , 1F
把i==2 的部份拿出 for, 這樣就可把 if-else 拿掉了。
03/24 22:19, 1F

03/24 22:21, , 2F
其實我是想用<寫法2>但一定要<寫法1>performance才會
03/24 22:21, 2F

03/24 22:21, , 3F
是我預期的結果
03/24 22:21, 3F

03/24 22:22, , 4F
您誤會我意思了..
03/24 22:22, 4F

03/24 22:23, , 5F
主要是i=2和i=3我要坐不一樣的兩件事我才分開寫
03/24 22:23, 5F

03/24 22:24, , 6F
若有不詳細的地方請見諒^ ^"
03/24 22:24, 6F

03/24 22:25, , 7F
http://codepad.org/RRiNj2kp 這樣不行嗎?
03/24 22:25, 7F

03/24 22:25, , 8F
還是你的 N 只到 4 ? 展開是肯定會較快無誤,但不該快
03/24 22:25, 8F

03/24 22:26, , 9F
到有「很明顯」的差異才對。
03/24 22:26, 9F

03/24 22:27, , 10F
N只有到4沒錯
03/24 22:27, 10F

03/24 22:29, , 11F
我想知道為何<寫法2>不行@ @
03/24 22:29, 11F

03/24 22:29, , 12F
Orz..如果N不會變的話,展開為佳,如果會變的話,用loop.
03/24 22:29, 12F

03/24 22:30, , 13F
N不會變
03/24 22:30, 13F

03/24 22:31, , 14F
但跑出來就是<寫法2>的結果比較差
03/24 22:31, 14F

03/24 22:34, , 15F
耶..我不知道你performance是怎麼測的,但正常只有二個
03/24 22:34, 15F

03/24 22:34, , 16F
算式的話,確實是會直接展開無誤。
03/24 22:34, 16F

03/24 22:35, , 17F
他的performance可能不是在說執行速度?
03/24 22:35, 17F

03/24 22:38, , 18F
我的performance是隨機的訊號~去跑錯誤的機率
03/24 22:38, 18F

03/24 22:39, , 19F
不是執行速度
03/24 22:39, 19F

03/24 22:42, , 20F
抱歉,誤會了,所以你是想確認,這二個script 是否一樣吧?
03/24 22:42, 20F

03/24 22:43, , 21F
沒錯!!
03/24 22:43, 21F

03/24 22:43, , 22F
但很明顯是一樣的~但跑出來結果就是不一樣
03/24 22:43, 22F

03/24 22:44, , 23F
我試過很多次了勒= ~ = 好苦惱~
03/24 22:44, 23F

03/24 22:47, , 24F
(無聊問一下,你該不會有用到 rand() 當參數設定吧 xd)
03/24 22:47, 24F

03/24 22:48, , 25F
我用srand(100)
03/24 22:48, 25F

03/24 22:49, , 26F
要做一樣的performance比較~所以srand()的seed我都沒
03/24 22:49, 26F

03/24 22:49, , 27F
去動它
03/24 22:49, 27F

03/24 23:29, , 28F
你兩個程式合在一起測的嗎?srand(100)有呼叫2次嗎
03/24 23:29, 28F

03/24 23:33, , 29F
要用<寫法1>就將<寫法2>砍掉
03/24 23:33, 29F

03/24 23:34, , 30F
srand(100)只有在主程式呼叫過一次
03/24 23:34, 30F

03/24 23:35, , 31F
我文章所提及的只是其中一個副程式而已
03/24 23:35, 31F

03/24 23:36, , 32F
<寫法1>和<寫法2>只是副程式中的某一段而已
03/24 23:36, 32F

03/24 23:46, , 33F
如果你之後有用到i 就會不一樣
03/24 23:46, 33F

03/25 00:30, , 34F
附上整個程式碼http://codepad.org/DkFsuCkd
03/25 00:30, 34F
※ 編輯: hiiammirror 來自: 140.114.15.28 (03/25 00:35)

03/25 08:24, , 35F
基本上用到for loop的話 assembly code會多一點
03/25 08:24, 35F

03/25 08:25, , 36F
應該就是這一點影響到performance吧
03/25 08:25, 36F

03/25 09:25, , 37F
N是多少? N如果不是3應該不會一樣吧
03/25 09:25, 37F

03/25 09:27, , 38F
歐...i如果是2,3那就不會有差才是
03/25 09:27, 38F

03/25 10:51, , 39F
這種程式碼不會在compiler自動opt?
03/25 10:51, 39F

03/25 13:14, , 40F
程式有點大~因此僅有貼上我有問題的副程式
03/25 13:14, 40F

03/25 13:21, , 41F
我也是覺得根本一樣那為啥performance就是不同(崩潰)
03/25 13:21, 41F

03/25 18:54, , 42F
看起來最有可能的是你在function外面使用到沒有初始化的
03/25 18:54, 42F

03/25 18:55, , 43F
變數,像是Qtilde_Real[1][0]之類的
03/25 18:55, 43F

03/25 22:12, , 44F
有初始化~它已經作了一些事情才到此副程式
03/25 22:12, 44F

03/26 15:20, , 45F
有個if就有branch就會慢
03/26 15:20, 45F

03/26 15:21, , 46F
compiler的optimization flag你怎麼設的?
03/26 15:21, 46F
文章代碼(AID): #1FRTTaJs (C_and_CPP)