內存拷貝函數對比測試

內存拷貝函數

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <errno.h>
#include <xmmintrin.h> // SSE Intrinsics#define SIZE_1K 1024
#define SIZE_1M (1024 * 1024)void* aligned_malloc(size_t size) {void* ptr = _mm_malloc(size, 16);if (!ptr) perror("aligned_malloc failed");return ptr;
}void* simd_memcpy(void* dest, const void* src, size_t size) {// Use unaligned load/store instructions in case of unaligned addresses__m128i* d = (__m128i*)dest;const __m128i* s = (__m128i*)src;size_t alignedSize = (size / sizeof(__m128i)) * sizeof(__m128i); // Size that can be copied by 128-bit chunks// Copy aligned part using SIMDfor (size_t i = 0; i < alignedSize / sizeof(__m128i); ++i) {_mm_storeu_si128(d++, _mm_loadu_si128(s++)); // Using unaligned instructions}// Handle remaining bytes if anysize_t remainingBytes = size - alignedSize;if (remainingBytes > 0) {char* byteDest = (char*)d;const char* byteSrc = (const char*)s;// Standard byte-by-byte copy for the remaindermemcpy(byteDest, byteSrc, remainingBytes);}return dest;
}void test_memcpy(void* (*func)(void* , const void* , size_t), size_t size, int iterations, const char* funcName) {if (!func || size <= 0) {fprintf(stderr, "Invalid arguments: function is NULL or size is non-positive.\n");return;}const char* src = (const char*)malloc(size);char* dst = (char*)malloc(size);if (!src || !dst) {perror("malloc failed");exit(EXIT_FAILURE);}struct timespec start, end;if (clock_gettime(CLOCK_MONOTONIC, &start) == -1) {perror("clock_gettime failed");}for (int i = 0; i < iterations; ++i) {func(dst, src, size); // Execute copy}if (clock_gettime(CLOCK_MONOTONIC, &end) == -1) {perror("clock_gettime failed");}double elapsed = (end.tv_sec - start.tv_sec) + (end.tv_nsec - start.tv_nsec) / 1e9;printf("Function: %s, Size: %zu bytes, Iterations: %d, Time: %.6f s\n", funcName, size, iterations, elapsed);
}int main() {// Test standard memcpytest_memcpy(memcpy, SIZE_1K, 2048*2048*3, "memcpy");// Test GCC's built-in memcpytest_memcpy(__builtin_memcpy, SIZE_1K, 2048*2048*3, "__builtin_memcpy");// Test SSE-based SIMD memcpy, ensuring memory is aligned{test_memcpy(simd_memcpy, SIZE_1K, 2048*2048*3, "simd_memcpy");}return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/40588.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/40588.shtml
英文地址,請注明出處:http://en.pswp.cn/web/40588.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

低代碼平臺在企業數字化轉型中的關鍵角色與應用

隨著數字化轉型的深入推進&#xff0c;企業越來越依賴于快速、靈活的軟件開發和部署方案。傳統的軟件開發往往需要大量的編碼工作和專業技能&#xff0c;而低代碼開發平臺則通過簡化開發流程、降低技術門檻&#xff0c;為企業提供了一種新的解決方案。本文將探討低代碼開發平臺…

從零開始使用WordPress搭建個人網站并一鍵發布公網詳細教程

文章目錄 前言1. 搭建網站&#xff1a;安裝WordPress2. 搭建網站&#xff1a;創建WordPress數據庫3. 搭建網站&#xff1a;安裝相對URL插件4. 搭建網站&#xff1a;內網穿透發布網站4.1 命令行方式&#xff1a;4.2. 配置wordpress公網地址 5. 固定WordPress公網地址5.1. 固定地…

ChatGPT:為什么很多算法經過二分思想的優化就變成了logn

ChatGPT&#xff1a;為什么很多算法經過二分思想的優化就變成了logn 很多算法在經過二分思想優化后&#xff0c;時間復雜度變成 O(log?n)&#xff0c;這主要是因為二分思想能夠顯著減少問題的規模。具體來說&#xff0c;二分思想通常應用于那些問題規模可以通過每一步驟減半的…

【LabVIEW學習篇 - 2】:LabVIEW的編程特點

文章目錄 LabVIEW的編程特點圖形編程天然并行運行基于數據流運行 LabVIEW的編程特點 圖形編程 LabVIEW使用圖形化的圖形化編程語言&#xff08;G語言&#xff09;&#xff0c;用戶通過在程序框圖中拖放和連接各種節點&#xff08;Nodes&#xff09;來編寫程序。每個節點代表一…

什么是跨域?——詳解跨域問題及其解決方案

目錄 引言什么是跨域同源策略跨域的產生原因跨域的常見解決方案 JSONPCORS代理服務器nginx反向代理后端設置允許跨域 CORS的詳細實現 瀏覽器中的CORS支持服務器端的CORS配置 常見的跨域場景和解決方案 跨域請求API跨域加載資源 跨域的安全性考慮跨域調試技巧總結 引言 在現代…

python+playwright 學習-90 and_ 和 or_ 定位

前言 playwright 從v1.34 版本以后支持and_ 和 or_ 定位 XPath 中的and和or xpath 語法中我們常用的有text()、contains() 、ends_with()、starts_with() //*[text()="文本"] //*[contains(@id, "xx")] //

LLM - 循環神經網絡(RNN)

1. RNN的關鍵點&#xff1a;即在處理序列數據時會有順序的記憶。比如&#xff0c;RNN在處理一個字符串時&#xff0c;在對字母表順序有記憶的前提下&#xff0c;處理這個字符串會更容易。就像人一樣&#xff0c;讀取下面第一個字符串會更容易&#xff0c;因為人對字母出現的順序…

idea MarketPlace插件找不到

一、背景 好久沒用idea了&#xff0c;打開項目后沒有lombok&#xff0c;安裝lombok插件時發現idea MarketPlace插件市場找不到&#xff0c;需要重新配置代理源&#xff0c;在外網訪問時通過代理服務進行連接 二、操作 ### File-->setting 快捷鍵 Ctrl Alt S 遠端源地…

動手學深度學習(Pytorch版)代碼實踐 -循環神經網絡-53語言模型和數據集

53語言模型和數據集 1.自然語言統計 引入庫和讀取數據&#xff1a; import random import torch from d2l import torch as d2l import liliPytorch as lp import numpy as np import matplotlib.pyplot as plttokens lp.tokenize(lp.read_time_machine())一元語法&#xf…

類和對象深入理解

目錄 static成員概念靜態成員變量面試題補充代碼1代碼2代碼3如何訪問private中的成員變量 靜態成員函數靜態成員函數沒有this指針 特性 友元友元函數友元類 內部類特性1特性2 匿名對象拷貝對象時的一些編譯器優化 感謝各位大佬對我的支持,如果我的文章對你有用,歡迎點擊以下鏈接…

Linux-DNS

DNS域名解析服務 1.DNS介紹 DNS 是域名系統 (Domain Name System) 的縮寫&#xff0c;是因特網的一項核心服務&#xff0c;它作為可以將域名和IP地址相互映射的一個分布式數據庫&#xff0c;能夠使人更方便的訪問互聯網&#xff0c;而不用去記住能夠被機器直接讀取的IP數串。…

大氣熱力學(2)——熱力學基礎

本篇文章源自我在 2021 年暑假自學大氣物理相關知識時手寫的筆記&#xff0c;現轉化為電子版本以作存檔。相較于手寫筆記&#xff0c;電子版的部分內容有補充和修改。筆記內容大部分為公式的推導過程。 文章目錄 2.0 本文所用符號一覽2.1 準靜態過程2.2 熱量和熱容量2.2.1 熱量…

Java對象

面向對象和面向過程的區別 兩者的主要區別在于解決問題的方式不同 面向過程把解決問題的過程拆成一個個方法&#xff0c;通過一個個方法的執行解決問題。 面向對象會先抽象出對象&#xff0c;然后用對象執行方法的方式解決問題。 另外&#xff0c;面向對象開發的程序一般更易維…

乞丐傳武功

題目 你施舍給了路邊的乞丐兩個饅頭&#xff0c;誰料這個乞丐其實是隱士高人。為了回報你的善心&#xff0c;只見他緩緩從懷中掏出了數本武功秘籍&#xff0c;讓你從中挑選一本。你珍重地接過這些秘籍&#xff0c;目光掃過每本封面&#xff0c;降龍十八掌、神照經、易筋經、凌…

[FreeRTOS 基礎知識] 互斥量 概念

文章目錄 基礎知識互斥量互斥量與信號量區別優先級反轉優先級繼承小結 基礎知識 [FreeRTOS 基礎知識] 信號量 概念 互斥量 互斥量&#xff08;Mutex&#xff0c;全稱&#xff1a;Mutual Exclusion&#xff09;&#xff0c;在計算機科學中&#xff0c;是一種用于防止多個進程同…

科研繪圖系列:R語言實驗結果組圖(linechart + barplot)

介紹 實驗結果的多樣性意味著每個結果都可能揭示研究的不同方面或角度。在科學研究和數據分析中,通常我們會收集一系列數據點,每個數據點都對應著實驗的一個特定變量或條件。為了全面理解這些數據,我們可能會采用多種可視化技術來展示它們。 將多個結果分別可視化,可以讓…

親子時光里的打臉高手,賈乃亮與甜馨的父愛如山

賈乃亮這波操作&#xff0c;簡直是“實力打臉”界的MVP啊&#xff01; 7月5號&#xff0c;他一甩手&#xff0c;甩出張合照&#xff0c; 瞬間讓多少猜測紛飛的小伙伴直呼&#xff1a;“臉疼不&#xff1f;”帶著咱家小甜心甜馨&#xff0c; 回了哈爾濱老家&#xff0c;這趟親…

Nginx(http配置、https配置)訪問Spring Boot 項目

前文 記錄一下在linux服務器下配置nginx中nginx.conf文件代理訪問springboot項目 1. spring boot.yml配置 其他mysql,redis,mybatis等之類的配置就不一一列出了 # 自定義配置 為了等下驗證讀取的配置文件環境 appName: productserver:port: 8083 # 應用服務 WEB 訪問端口s…

SQL窗口函數詳解

詳細說明在sql中窗口函數是什么&#xff0c;為什么需要窗口函數&#xff0c;有普通的聚合函數了那窗口函數的意義在哪&#xff0c;窗口函數的執行邏輯是什么&#xff0c;over中的字句是如何使用和理解的&#xff08;是不是句句戳到你的痛點&#xff0c;哼哼&#xff5e;&#x…

C語言編譯和編譯預處理

編譯預處理 ? 編譯是指把高級語言編寫的源程序翻譯成計算機可識別的二進制程序&#xff08;目標程序&#xff09;的過程&#xff0c;它由編譯程序完成。 ? 編譯預處理是指在編譯之前所作的處理工作&#xff0c;它由編譯預處理程序完成 在對一個源程序進行編譯時&#xff0c;…