Linux编程:测试-高效内存复制与随机数生成的性能

本文涉及的产品
无影云电脑个人版,1个月黄金款+200核时
轻量应用服务器 2vCPU 4GiB,适用于搭建容器环境
无影云电脑企业版,8核16GB 120小时 1个月
简介: 该文探讨了软件工程中的性能优化,重点关注内存复制和随机数生成。文章通过测试指出,`g_memmove`在内存复制中表现出显著优势,比简单for循环快约32倍。在随机数生成方面,`GRand`库在1000万次循环中的效率超过传统`rand()`。文中提供了测试代码和Makefile,建议在性能关键场景中使用`memcpy`、`g_memmove`以及高效的随机数生成库。

文章是我2011年写的,搬运过来。 顺便用大模型润色了一下。


引言

在软件工程领域,性能优化始终是一个热门话题,尤其是在内存操作和随机数生成方面。本文将通过一系列测试结果,对比不同方法在内存复制和随机数生成上的效率,重点突出memcpyg_memmove的优异表现。同时,我们将分享具体的测试代码和构建流程,帮助读者更好地理解和实践。

内存复制性能对比

在内存复制操作中,我们分别测试了字节级复制、4字节复制、8字节复制,以及使用g_memmove函数的性能。结果显示,g_memmove在10万次循环的测试中,仅耗时32.19ms,远低于其他逐字节或逐元素复制的方式。具体而言,g_memmove比简单的for循环快约32倍,这得益于其内部优化的内存复制算法。

随机数生成效率分析

在随机数生成方面,我们对比了三种方法:传统rand()函数、简化的rand()使用方式,以及使用GRand库的随机数生成。测试表明,虽然rand()和其简化版本的性能相当,但GRand库提供的随机数生成在1000万次循环中表现出了更高的效率,平均每次循环耗时仅61.44ns,这体现了高级随机数生成库的优化效果。

测试代码与构建流程

以下为用于性能测试的源代码及Makefile配置,便于读者复现实验结果。

C

#include <gtk/gtk.h>
#include <glib.h>
#include <stdlib.h>

#define MAX_SIZE       1024

void Comput_Print_Result(gchar *str, guint loops, GTimeVal tStart);

int main(int argc, char **argv)
{
    guchar buf111[MAX_SIZE];
    guchar buf222[MAX_SIZE];
    GTimeVal tstart;
    guint i, j;
    guint testTimes = 100000;

    // 初始化数据
    for(i = 0; i < MAX_SIZE; i++)
    {
        buf111[i] = 1;
        buf222[i] = 2;
    }

    // 开始测试:1字节复制
    g_get_current_time(&tstart);
    for(j = 0; j < testTimes; j++)
        for(i = 0; i < MAX_SIZE; i++)
            buf111[i] = buf222[i];
    Comput_Print_Result("1byte copy    ", testTimes, tstart);

    // 更多测试代码...

    // 结束测试:内存复制验证
    for(i = 0; i < MAX_SIZE; i++)
        if(buf111[i] != buf222[i])
            g_print("mem copy failed\n");

    // 随机数生成测试代码...
    
    return 0;
}

void Comput_Print_Result(gchar *str, guint loops, GTimeVal tStart)
{
    GTimeVal tEnd;
    g_get_current_time(&tEnd);
    gfloat time_msec = (1000000.00 * (tEnd.tv_sec - tStart.tv_sec) + tEnd.tv_usec - tStart.tv_usec) / 1000;
    gfloat time_each = time_msec / loops * 1000000;
    g_print("Time %s: %.2fms used for %d loops. Each loop %.2fns\n", str, time_msec, loops, time_each);
}

Makefile配置如下:

Makefile

CC=gcc
PROG_NAME=PerformanceTest
INCS=
SRCS=PerformanceTest.c
OBJS=${SRCS:.c=.o}
LIBS=gtk+-2.0

CFLAGS=`pkg-config --cflags ${LIBS}` -g -Wall
LDFLAGS=`pkg-config --libs ${LIBS}` -g -Wall

all: ${PROG_NAME}

${PROG_NAME}:${OBJS}
    ${CC} -o ${PROG_NAME} ${OBJS} ${LDFLAGS}

${OBJS}:${INCS}

.c.o:
    ${CC} -c $< ${CFLAGS}

clean:
    rm -f *.o ${PROG_NAME}

rebuild: clean all

结论

通过上述测试,我们得出结论:当涉及大量内存复制时,g_memmove应作为首选,因为它在性能上明显优于传统的for循环复制方法。同样,在随机数生成场景下,使用GRand库可以带来更好的效率。这些发现强调了选择合适工具的重要性,尤其是在追求高性能的应用场景中。

推荐实践

  • 对于频繁的内存复制操作,考虑使用memcpyg_memmove,它们经过优化,能显著提高复制速度。
  • 当需要生成大量随机数时,评估并选择性能最优的随机数生成库,如GRand,以减少计算延迟。
  • 在编写性能敏感的代码时,进行基准测试是必要的,以确保选择的方法达到预期的性能目标。

通过本文的测试和分析,我们不仅验证了memcpyg_memmove在内存复制上的高效性,也展示了如何通过适当的工具和方法优化随机数生成的性能。希望这些发现能为你的项目带来实质性的性能提升

相关文章
|
4月前
|
人工智能 自然语言处理 安全
学不会编程也能写测试?AI让测试更平权
在传统的软件开发体系中,测试常被划分为“技术型测试”(如自动化、性能、安全)和“业务型测试”(如功能验证、用户体验)。前者掌握技术话语权,后者则更多依赖经验和流程规范。然而,随着大语言模型(LLM)等AI技术的迅猛发展,这一固有格局正被悄然打破:
157 10
|
8月前
|
缓存 Linux
linux 手动释放内存
在 Linux 系统中,内存管理通常自动处理,但业务繁忙时缓存占用过多可能导致内存不足,影响性能。此时可在业务闲时手动释放内存。
403 17
|
4月前
|
缓存 Linux 数据安全/隐私保护
Linux环境下如何通过手动调用drop_caches命令释放内存
总的来说,记录住“drop_caches” 命令并理解其含义,可以让你在日常使用Linux的过程中更加娴熟和自如。
996 23
|
6月前
|
监控 Linux Python
Linux系统资源管理:多角度查看内存使用情况。
要知道,透过内存管理的窗口,我们可以洞察到Linux系统运行的真实身姿,如同解剖学家透过微观镜,洞察生命的奥秘。记住,不要惧怕那些高深的命令和参数,他们只是你掌握系统"魔法棒"的钥匙,熟练掌握后,你就可以骄傲地说:Linux,我来了!
226 27
|
7月前
|
消息中间件 Linux
Linux中的System V通信标准--共享内存、消息队列以及信号量
希望本文能帮助您更好地理解和应用System V IPC机制,构建高效的Linux应用程序。
263 48
|
6月前
|
机器学习/深度学习 设计模式 测试技术
Python 高级编程与实战:构建自动化测试框架
本文深入探讨了Python中的自动化测试框架,包括unittest、pytest和nose2,并通过实战项目帮助读者掌握这些技术。文中详细介绍了各框架的基本用法和示例代码,助力开发者快速验证代码正确性,减少手动测试工作量。学习资源推荐包括Python官方文档及Real Python等网站。
|
7月前
|
缓存 NoSQL Linux
Linux系统内存使用优化技巧
交换空间(Swap)的优化 禁用 Swap sudo swapoff -a 作用:这个命令会禁用系统中所有的 Swap 空间。swapoff 命令用于关闭 Swap 空间,-a 参数表示关闭 /etc/fstab 文件中配置的所有 Swap 空间。 使用场景:在高性能应用场景下,比如数据库服务器或高性能计算服务器,禁用 Swap 可以减少磁盘 I/O,提高系统性能。
284 3
|
7月前
|
缓存 Linux
Linux查看内存命令
1. free free命令是最常用的查看内存使用情况的命令。它显示系统的总内存、已使用内存、空闲内存和交换内存的总量。 free -h • -h 选项:以易读的格式(如GB、MB)显示内存大小。 输出示例: total used free shared buff/cache available Mem: 15Gi 4.7Gi 4.1Gi 288Mi 6.6Gi 9.9Gi Swap: 2.0Gi 0B 2.0Gi • to
551 2
|
3月前
|
Java 测试技术 容器
Jmeter工具使用:HTTP接口性能测试实战
希望这篇文章能够帮助你初步理解如何使用JMeter进行HTTP接口性能测试,有兴趣的话,你可以研究更多关于JMeter的内容。记住,只有理解并掌握了这些工具,你才能充分利用它们发挥其应有的价值。+
732 23
|
8月前
|
数据可视化 前端开发 测试技术
接口测试新选择:Postman替代方案全解析
在软件开发中,接口测试工具至关重要。Postman长期占据主导地位,但随着国产工具的崛起,越来越多开发者转向更适合中国市场的替代方案——Apifox。它不仅支持中英文切换、完全免费不限人数,还具备强大的可视化操作、自动生成文档和API调试功能,极大简化了开发流程。