2010-10-19 71 views
2

我有一個ANSI C代碼,大約10,000行,我嘗試在iPhone項目中使用。當我在命令行上的gcc編譯代碼,我鍵入以下內容:將代碼導入到iphone項目後運行非常緩慢的代碼

的gcc -o MYPROG -O3 myprog.c中

這項計劃在很大程度上JPEG文件讀取並執行對他們的一些奇特的處理,所以我把它用下面的

./myprog mypic.jpg

並通過命令行,這需要花費約0.1秒。

我想將這段代碼導入到一個iPhone項目中,但我並不完全知道如何。我能夠通過將myprog.c重命名爲myprog.h,然後在通用的NSObject類中調用C代碼中的函數來成功編譯和運行。我將O3優化添加到項目的其他C標誌。但是,當我這樣做時,模擬器上的代碼需要大約2秒鐘的時間才能運行,而iPhone上的代碼運行時間大約需要7秒,這會導致無法接受的用戶體驗。

關於鋤頭的任何提示,以獲得這一進展將不勝感激。

+0

在後臺線程中運行它並提供進度條?聽起來這只是一個處理器速度問題。 – 2010-10-19 19:58:22

回答

3

很難確定慢慢來自何處,或者周圍有什麼方法,但是馬上就會發生錯誤。

您不應該將.c文件重命名爲.h文件並將其包含在內。你應該已經編寫了有函數,變量和類型聲明宣佈的.h(頭)文件:

myprog.h:

#ifndef MYPROG_H_ 
#define MYPROG_H_ 

struct thing { 
    int a; 
    int b; 
}; 

extern int woof; 

int foo(void * buf, int size); 

#endif /* MYPROG_H_ */ 

那麼你應該編譯.c文件到目標文件(或庫),並將主程序與該程序鏈接起來。如果您將.h文件實際上只是一個重命名的.c文件包含到多個源代碼文件中,則可能導致程序中有多個版本的數據和代碼。

您可能還想通過並分離myprog.c中的任何代碼,而這些代碼不會在iPhone程序中使用。我敢打賭,有很多。

至於爲什麼程序放緩,這可能與編寫myprog有關,以利用iPhone上不可用的一些資源。首先想到的就是大量的RAM,因爲許多桌面應用程序都是像可用RAM一樣寫入的,我可以看到如何用這種方式編寫一些.jpg操作代碼。解決這個問題的方法是嘗試重寫算法,以便在處理該算法時不會一次加載多少圖片。

第二件事就是浮點代碼。浮點操作在圖像處理代碼中很常見,但通常在嵌入式系統中不可用或者受到嚴格限制。就iPhone而言,它們是可用的,但根據我聽到的情況,如果您將代碼編譯爲拇指而非常規ARM代碼,則其性能明顯受到阻礙。 (我從來沒有開發iPhone或其特定的處理器,所以我不知道,但值得研究)。

另一個地方,事情可能會放緩,如果有某種目標C對象和C結構之間的轉換,你已經以某種方式引入的,往往比它應該需要發生很多會。由於這個原因,可能會發生其他緩慢的情況,但是您可以通過爲您的桌面創建一個客觀的C程序來測試該理論,該程序使用myprog.c代碼的方式類似於iPhone程序的使用方式。

你可能應該考慮的另一件事是分析你的iPhone程序。分析確定(或僅有助於確定某些情況下)程序花費時間的情況。知道這並不一定告訴你,運行最多的代碼是不好的,或者它的任何事情都可以改進,但它確實告訴你在哪裏尋找。有時你可能會看看結果,並立即知道你認爲在程序開始時只會調用一次的函數實際上被重複調用,這高度表明可以做出一些改進。

我敢肯定,一點搜索將會變成如何去做這件事。