[問題] 寫XOR比較效能,但CUP時間都是0

看板C_and_CPP作者 (mark)時間8年前 (2015/08/28 17:32), 8年前編輯推噓4(4021)
留言25則, 11人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) VC++ 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) 問題(Question): 寫XOR和System比效能,但算出的cpu時間都是0求解 餵入的資料(Input): 111.....11^000.....00 預期的正確結果(Expected Output): 應該會出現大於0毫秒 錯誤結果(Wrong Output): 0毫秒 程式碼(Code):(請善用置底文網頁, 記得排版) #include <stdio.h> #include <stdlib.h> #include <time.h> char XOR(char, char); int main(void) { clock_t start_tick, end_tick; long long elapsed; char A[128], B[128],C[128]; int i; for (i = 1; i < 128; i++) { A[i] = '0'; B[i] = '1'; } start_tick = clock(); //---system XOR--- for (i = 1; i < 128; i++) C[i] = A[i] ^ B[i]; end_tick = clock(); elapsed = end_tick - start_tick; printf("System XOR using time:%f\n", elapsed); //------------------------------------------------------------------------ start_tick = clock(); //---my XOR--- for (i = 1; i < 128; i++) C[i] = XOR(A[i], B[i]); end_tick = clock(); elapsed = end_tick - start_tick; printf("My XOR using time:%f\n", elapsed); system("pause"); return 0; } char XOR(char A, char B) { if (A == B) return '0'; else return '1'; } 補充說明(Supplement): 此程式為了比較我寫的XOR (不使用^) 跟直接用系統的XOR (使用^) ,在效能上有沒有差 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.41.4.182 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1440754340.A.F83.html chigi: CUP 抱歉已修改 08/28 17:36 ※ 編輯: mark182908 (114.41.4.182), 08/28/2015 17:57:44 ※ 編輯: mark182908 (114.41.4.182), 08/28/2015 18:05:05

08/28 18:32, , 1F
用clock 單位最小就毫秒 但他沒有超過1 就變0了這樣
08/28 18:32, 1F
了解但我查了一下C似乎最小時間單位是毫秒,請問大大有其他方法能到更精準嗎?謝謝 ※ 編輯: mark182908 (114.41.4.182), 08/28/2015 19:42:13

08/28 19:43, , 2F
你比較的目的是甚麼?
08/28 19:43, 2F
我的目的是為了比較我自己寫的XOR和系統呼叫的XOR在執行速度上差多少,不好意思沒寫清楚 ※ 編輯: mark182908 (114.41.4.182), 08/28/2015 19:59:56

08/28 20:03, , 3F
那就跑個一萬次?
08/28 20:03, 3F

08/28 20:03, , 4F
雖然我是覺得這樣意義不大
08/28 20:03, 4F

08/28 20:23, , 5F
意義不大,而且感覺你的會比較慢
08/28 20:23, 5F

08/28 20:44, , 6F
你的要call 比較慢 不過編譯器會最佳化
08/28 20:44, 6F

08/28 20:45, , 7F
加上你計算量小 測也沒意義
08/28 20:45, 7F
了解謝謝各位,那請問XOR怎麼寫才會跟系統一樣快呢? ※ 編輯: mark182908 (114.41.4.182), 08/28/2015 20:53:22

08/28 20:56, , 8F
用系統的 (逃
08/28 20:56, 8F
哈哈好像滿有道理的喔!

08/28 20:59, , 9F
xor就是一條cpu指令而已 用系統的就好了
08/28 20:59, 9F
那我懂了,但我還想請教x大若不使用系統的XOR,那我的方法算好嗎?因為做專題需要教授要我寫出最好的XOR,不好意思問題有點多... ※ 編輯: mark182908 (114.41.4.182), 08/28/2015 21:09:19 ※ 編輯: mark182908 (114.41.4.182), 08/28/2015 21:10:16

08/28 21:39, , 10F
兩個bit相加取低位元
08/28 21:39, 10F
不知道是不是小弟我才疏學淺,但C好像沒有辦法用Binary,若有煩請大大解答謝謝

08/28 21:55, , 11F
elapsed是long long怎麼會用%f印...
08/28 21:55, 11F
不好意思用錯已改成double宣告

08/28 23:26, , 12F
感覺教授是希望以數位邏輯概念,用and.or.not去兜
08/28 23:26, 12F
謝謝大大醍醐灌頂

08/29 01:08, , 13F
要比單一的硬體指令還要快…我有點難想像XD
08/29 01:08, 13F
我覺得可能是要試著寫到很接近的意思

08/29 02:25, , 14F
A[i] ^ B[i] 這不對吧
08/29 02:25, 14F

08/29 02:28, , 15F
雖然'0'跟'1'在最LSB是差1,不過拿char來xor好嗎
08/29 02:28, 15F
已改成int謝謝提醒

08/29 02:32, , 16F
而且算出來的也是'\0'跟'\1'
08/29 02:32, 16F

08/29 07:32, , 17F
你寫的不叫做XOR吧
08/29 07:32, 17F

08/29 07:35, , 18F
CPU上XOR是bitwise,你用一個8bits來代表0跟1有點…
08/29 07:35, 18F
我有在想這個問題,但查了資料後找不到方法宣告成bit...

08/29 07:58, , 19F
A^B=(~A) & B | A & (~B) 用這個公式照寫就對了
08/29 07:58, 19F

08/29 08:00, , 20F
Compiler 很聰明,寫成這樣子,他會自動幫你轉為A^B
08/29 08:00, 20F

08/29 08:01, , 21F
那這樣跟直接^就沒有差別了吧
08/29 08:01, 21F

08/29 08:02, , 22F
127次迴圈測不出來差異,就改用0x7fffffff就看得出來了
08/29 08:02, 22F

08/29 08:07, , 23F
沒錯,因為compiler太聰明了,即使寫function他都會幫
08/29 08:07, 23F

08/29 08:07, , 24F
你inline進去
08/29 08:07, 24F
謝謝j大受益良多!!

08/29 08:31, , 25F
好吧等等來看看assembly
08/29 08:31, 25F
謝謝大家的指導小弟我受教了!! ※ 編輯: mark182908 (114.41.4.182), 08/30/2015 23:25:03
文章代碼(AID): #1Lu2ga-3 (C_and_CPP)