2016-03-07 61 views
1

我使用此代码实时打开一个记录文件,并使用FSEEK()和FTELL文件大小(),以获得文件大小:帮助优化函数来获取在一个循环

typedef struct _Recording Recording; 
struct _Recording 
{ 
    FILE *file; 
    long filesize; 
    int progress_id; 
    ... 
}; 

void start_recording(Recording *recording, char* filepath) 
{ 
     ...   
     recording->file = fopen(filepath, "rb"); 
     recording->progress_id = 
      g_timeout_add (500, (GSourceFunc) progress_timeout, recording); 
} 

gboolean progress_timeout (Recording *recording) 
{ 
     if (recording->file != NULL) 
     { 
      fseek(recording->file, 0, SEEK_END); 
      recording->filesize = ftell(recording->file);   
     } 

     return TRUE; 
} 

void stop_recording(Recording *recording) 
{ 
     ... 
     if (recording->file) 
     { 
      fclose (recording->file); 
      recording->file = NULL; 
     } 

     if (recording->progress_id != 0) 
     { 
      g_source_remove (recording->progress_id); 
      recording->progress_id = 0; 
     } 
} 

我使用这个函数在一个循环中(500毫秒)。需要帮助来优化功能才能更快。

代码的效率。

与循环功能

+0

(与代码无关,但是..)你使用什么编译器?试试'gcc -O3'。 –

+0

详细信息:使用'long filesize;' – chux

+3

更好使用[fstat](http://linux.die.net/man/2/fstat) – chux

回答

3

更新。如果你不要求提供“最大”(questioned)的兼容性,是有意义的像fstatuse operating system specific功能。打开一个文件总是会有开销,甚至寻找到最后 - 操作系统试图预测你正在做什么,并可能开始将文件内容缓存到内存中 - 在这种情况下是不必要的。

2

代码访问文件系统;文件系统和物理磁盘访问的性能将占主导地位。此外,大部分执行的代码都是操作系统和文件系统代码,而不是你自己的代码,因此不需要对代码进行优化就可以提供帮助。

使用较低级别或操作系统特定的API而不是stdio可能会带来一些边际收益,例如,用于POSIX的stat()fstat()或用于Windows的GetFileSizeEx()。这些直接得到的大小,而不是使用fseek()所以可能会更快,但可能不是因为给出的原因显着。