帮助优化函数以在循环中获取文件大小

时间:2016-03-07 19:00:43

标签: c

我使用此代码实时打开录制文件,并使用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毫秒)。需要帮助优化功能才能更快。

代码的效率。

用循环函数更新

2 个答案:

答案 0 :(得分:3)

如果您不需要“最大”(questioned)兼容性,则对func imageTapped(gestureRecognizer: UIGestureRecognizer) { let img = gestureRecognizer.view as! UIImageView print("imageTapped indexOf = \(imgs.indexOf(img))") } use operating system specific函数有意义。打开一个文件总是有开销,甚至寻求到最后 - 操作系统试图预测你正在做什么,并可能开始将文件内容缓存到内存中 - 在这种情况下是不必要的。

答案 1 :(得分:2)

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

使用较低级别或特定于操作系统的API而不是stdio可能会有一些微不足道的好处,例如POSIX为stat()fstat(),Windows为GetFileSizeEx()。这些直接获得大小而不是使用fseek()因此可能会更快,但可能由于给出的原因而不显着。