代码优化的一点心得(1)

version 1:

//如果当前数据库文件中 video_info 表中记录元素达到1000个视频的话,会清除掉该表中所有的记录
void VappVideoListPage::delVideoInfoTableInDB(void)
{
    FS_HANDLE fh = 0;
    
    fh = FS_Open((const WCHAR*)L"D:\\@MediaCache\\Gallery.db", FS_READ_ONLY);//L"D:\\@MediaCache\\Gallery.db"

    //如果该文件不存在,则直接退出
    if(fh < FS_NO_ERROR)
    {
        return;
    }
    
    FS_Close(fh);
    fh = -1;
    
    if(NULL == m_videoDB)
    {
        VFX_OBJ_CREATE(m_videoDB, VappGalleryDB, this);
    }

    //当数据库中内容达到1024条记录时删除掉该数据库文件
    if(m_videoDB->getCurrVideoTotalNumber() >= (MAX_CUR_DB_VIDEO_NUMBER - 24))//(MAX_CUR_DB_VIDEO_NUMBER/2))
    {
        VFX_OBJ_CLOSE(m_videoDB);
        FS_Delete((const WCHAR *)L"D:\\@MediaCache\\Gallery.db");
    }

    VFX_OBJ_CLOSE(m_videoDB);
}

version 2:

//如果当前数据库文件中 video_info 表中记录元素达到1000个视频的话,会清除掉该表中所有的记录
void VappVideoListPage::delVideoInfoTableInDB(void)
{
    WCHAR folder_path[SRV_FMGR_PATH_MAX_LEN + 1] = {0};
    FS_HANDLE fh = 0;
    
    kal_wsprintf(folder_path, "%c:\\%w", SRV_FMGR_PHONE_DRV, L"@MediaCache\\Gallery.db");
    fh = FS_Open((const WCHAR*)folder_path, FS_READ_ONLY);//L"D:\\@MediaCache\\Gallery.db"

    //如果该文件不存在,则直接退出
    if(fh < FS_NO_ERROR)
    {
        return;
    }
    
    FS_Close(fh);
    fh = -1;
    
    if(NULL == m_videoDB)
    {
        VFX_OBJ_CREATE(m_videoDB, VappGalleryDB, this);
    }

    //当数据库中内容达到1024条记录时删除掉该数据库文件
    if(m_videoDB->getCurrVideoTotalNumber() >= (MAX_CUR_DB_VIDEO_NUMBER - 24))//(MAX_CUR_DB_VIDEO_NUMBER/2))
    {
        VFX_OBJ_CLOSE(m_videoDB);
        FS_Delete((const WCHAR *)folder_path);
    }

    VFX_OBJ_CLOSE(m_videoDB);
}

vesion 3:

//如果当前数据库文件中 video_info 表中记录元素达到1000个视频的话,会清除掉该表中所有的记录
//模拟器上该db的路径是 L"D:\\@MediaCache\\Gallery.db",真机上路径是 L"C:\\@MediaCache\\Gallery.db"
//注意真机上手机盘符是C,而模拟器上手机盘符是D
void VappVideoListPage::delVideoDBFile(void)
{
    FS_HANDLE fh = 0;
    WCHAR* folder_path  = NULL;
    U32 buff_size = (SRV_FMGR_PATH_MAX_LEN + 1 ) * sizeof(WCHAR);
    
    VFX_SYS_ALLOC_MEM(folder_path, (SRV_FMGR_PATH_MAX_LEN + 1 ) * sizeof(WCHAR));

    //如果申请空间失败,则直接退出
    if(!folder_path)
    {
        return;
    }
    
    kal_wsprintf(folder_path, "%c:\\%w", SRV_FMGR_PHONE_DRV, L"@MediaCache\\Gallery.db");

    fh = FS_Open((const WCHAR*)folder_path, FS_READ_ONLY);

    //如果该文件不存在,则直接退出
    if(fh < FS_NO_ERROR)
    {
        kal_prompt_trace(MOD_NIL,"gallery.db is not exist...");
        return;
    }

    kal_prompt_trace(MOD_NIL,"gallery.db is exist!!!");
    FS_Close(fh);
    fh = -1;
    
    if(NULL == m_videoDB)
    {
        VFX_OBJ_CREATE(m_videoDB, VappGalleryDB, this);
    }

    //当数据库中内容达到1000条记录时删除掉该数据库文件
    S32 count = m_videoDB->getCurrVideoTotalNumber();
    kal_prompt_trace(MOD_NIL,"gallery.db video_info has %d records",count);
    if(count >= (MAX_CUR_DB_VIDEO_NUMBER - 24))
    {
        VFX_OBJ_CLOSE(m_videoDB);
        FS_Delete((const WCHAR *)folder_path);
        kal_prompt_trace(MOD_NIL,"gallery.db delete succees!!!");
    }
    else
    {
        VFX_OBJ_CLOSE(m_videoDB);
    }
    
    VFX_SYS_FREE_MEM(folder_path);
}


能看出这三个版本的区别吗?

Gallery.db文件是存在 手机盘:\@MediaCache\  目录下

1,version 2中主要是修改了绝对路径的引用,因为在真机上手机盘符为 C,而在模拟器上手机盘符为 D

在自测试的时候发现模拟器上删除ok,而在真机上不ok,才查到此原因的。

2,version 2中为了获取手机盘盘符使用了一个大的字符数组,总共520个字节,由于在嵌入式上编程,栈空间太小,总共大约22K吧,

如果调用层级太深的话,而且每层函数上面挂的局部变量太多,很容易把栈空间撑爆。这一点必须注意。

3,version 3中动态申请内存空间,该部分内存在系统堆上面。这里面添加了必要的trace信息可以查看是否在真机上有操作成功。

另外 version 3中修改了函数名,是删除整个db文件,而非db中的一个表。词更达意,自注释性更好。


优化代码要考虑的东西真不少...

version 4:

    VFX_SYS_ALLOC_MEM(folder_path, buff_size);

    //如果申请空间失败,则直接退出
    if(!folder_path)
    {
        return;
    }

    memset(folder_path, 0x00, buff_size);

version 3 中犯了一个常识性的错误,不知道您看出来没,在申请到内存成功后,应将申请到的那一片空间清零,

由于 folder_path 中并没有结束符,如果不清空的话,导致 folder_path 后面可能正好连接的是一块脏数据,那这个地址就失效了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值