爲我的學士論文我寫了一個程序(用C語言)對大表進行排序,現在一切正常。但是,對於我的一些測試文件,該程序有點慢。爲了能夠更有效地存儲臨時數據,用戶可以爲表格的每一列指定數據類型。然後,輸入數據首先被解析成二進制格式,然後被排序並最終轉換回其文本形式。循環中的函數指針
對於每個數據類型,必須實現四個函數(編碼,解碼,gengthngth和比較),並且指向這些數據的指針存儲在每個列的數組中。因此,要對錶格中的某行執行任何操作,我必須爲循環中的每一行調用正確的函數,如果列相當短,這會有相當大的開銷。
作爲一個例子,這裏是我行比較功能(來自的qsort調用)的代碼:
int line_cmp(const void *p1,const void *p2)
{
int i,o1=0,o2=0,r;
for(i=0;i<opt.nocols;i++)
if((r=(*opt.cols[i].cmp)(*(char* const*)p1,&o1,
*(char* const*)p2,&o2)))
return r;
return 0;
}
此功能通過所有列,如果被調用函數返回0以外的值(意爲不循環等於)返回值(就像qsort的要求一樣)。
現在我的問題是,如何優化這個(或類似的)函數(如果可能的話),特別是當所有的指針只設置一次,然後在整個程序期間從未改變?
編輯:我使用函數指針,以便第三人可以開發任意數據類型。這些將通過(dlopen等)加載。因此,我想不出一個通用的二進制格式來比較列,二進制數據只是我的程序的黑盒子。
你所提供的代碼基本上是一個簡單的循環,每次通過一次調用。很難看到如何進一步優化。我猜你沒有發佈使用編碼,解碼和gengthngth功能的地方? – 2011-04-01 12:09:00
@Jonathan Wood:我選擇這個功能作爲例子,因爲它是最長的。其他函數只是一個for和一個函數的調用。 – sl0815 2011-04-01 12:12:05
爲什麼你不使用分析工具來找出瓶頸所在。 – Milan 2011-04-01 12:21:14