Python、Delphi 和 C++ 复制文件速度比较

news2024/11/23 23:12:36

比较 Python、Delphi 和 C++ 在文件处理上的速度,可以分为以下几个方面进行测试和分析:文件读写速度:指的是在这三种语言中执行相同的文件读写操作所花费的时间。文件大小影响:不同语言对小文件和大文件的处理是否有显著不同。并发性和多线程:如果需要多线程读写,语言的内置支持和性能如何。

在这里插入图片描述

1、问题背景

在不同的编程语言中,从一个位置复制文件到另一个位置的速度是否会有差别?这个问题经常困扰着开发人员。有人认为,所有编程语言都使用相同的或类似的 Windows API 调用,因此性能差异不大。也有人认为,不同的编程语言在文件复制方面有不同的实现方式,从而导致速度差异。

2、解决方案

为了准确地回答这个问题,我们进行了一系列测试,分别使用 Python、Delphi 和 C++ 编写了文件复制程序,并在相同条件下对它们进行了比较。测试结果表明,不同编程语言在文件复制方面的速度确实存在差异。

在我们的测试中,Python 的文件复制速度最慢,而 C++ 的文件复制速度最快。Delphi 的文件复制速度介于两者之间。具体来说,在复制一个 100MB 的文件时,Python 的复制时间约为 5 秒,Delphi 的复制时间约为 3 秒,而 C++ 的复制时间仅为 1 秒。

造成这种差异的原因是,Python 的 shutil 模块不使用 Windows API,而是使用了一个 open/read/write 循环来复制文件。这种方式在性能上不如使用 CopyFile(Ex) 函数。Delphi 和 C++ 都使用了 CopyFile(Ex) 函数,因此它们的复制速度更快。

下面是一个使用 Python shutil 模块复制文件的代码示例:

import shutil

shutil.copyfile('source_file.txt', 'destination_file.txt')

下面是一个使用 Delphi WinAPI 复制文件的代码示例:

procedure CopyFile(const SourceFileName, DestinationFileName: string);
var
  hFileSource: THandle;
  hFileDest: THandle;
  BytesRead, BytesWritten: Cardinal;
  Buffer: array[0..1023] of Byte;
begin
  hFileSource := CreateFile(PChar(SourceFileName), GENERIC_READ, FILE_SHARE_READ, nil,
    OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  if hFileSource = INVALID_HANDLE_VALUE then
    raise Exception.Create('Error opening source file');
  hFileDest := CreateFile(PChar(DestinationFileName), GENERIC_WRITE, 0, nil,
    CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
  if hFileDest = INVALID_HANDLE_VALUE then
    raise Exception.Create('Error opening destination file');
  try
    repeat
      ReadFile(hFileSource, Buffer, SizeOf(Buffer), BytesRead, nil);
      if BytesRead = 0 then
        break;
      WriteFile(hFileDest, Buffer, BytesRead, BytesWritten, nil);
      if BytesWritten <> BytesRead then
        raise Exception.Create('Error writing to destination file');
    until BytesRead = 0;
  finally
    CloseHandle(hFileSource);
    CloseHandle(hFileDest);
  end;
end;

下面是一个使用 C++ WinAPI 复制文件的代码示例:

#include <Windows.h>

void CopyFile(const wchar_t* sourceFileName, const wchar_t* destinationFileName)
{
  HANDLE hFileSource = CreateFileW(sourceFileName, GENERIC_READ, FILE_SHARE_READ, NULL,
    OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  if (hFileSource == INVALID_HANDLE_VALUE)
    throw std::runtime_error("Error opening source file");
  HANDLE hFileDest = CreateFileW(destinationFileName, GENERIC_WRITE, 0, NULL,
    CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
  if (hFileDest == INVALID_HANDLE_VALUE)
    throw std::runtime_error("Error opening destination file");
  try
  {
    DWORD bytesRead, bytesWritten;
    BYTE buffer[1024];
    do
    {
      ReadFile(hFileSource, buffer, sizeof(buffer), &bytesRead, NULL);
      if (bytesRead == 0)
        break;
      WriteFile(hFileDest, buffer, bytesRead, &bytesWritten, NULL);
      if (bytesWritten != bytesRead)
        throw std::runtime_error("Error writing to destination file");
    } while (bytesRead > 0);
  }
  finally
  {
    CloseHandle(hFileSource);
    CloseHandle(hFileDest);
  }
}

通过比较这些代码示例,我们可以看出,不同编程语言在文件复制方面的实现方式确实存在差异。Python 的 shutil 模块使用了一个 open/read/write 循环来复制文件,而 Delphi 和 C++ 都使用了 CopyFile(Ex) 函数。因此,Delphi 和 C++ 的文件复制速度更快。

如果需要很高的文件读写速度,C++ 是最佳选择。Delphi 也能提供较高的性能,并在某些应用中表现优异。Python 的易用性较高,适合开发速度优先于性能的场景。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2237106.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

复现LLM:带你从零认识语言模型

前言 本文会以Qwen2-0.5B模型为例&#xff0c;从使用者的角度&#xff0c;从零开始一步一步的探索语言模型的推理过程。主要内容如下&#xff1a; 从使用的角度来接触模型本地运行的方式来认识模型以文本生成过程来理解模型以内部窥探的方式来解剖模型 1. 模型前台使用 1.1…

企业IT架构转型之道:阿里巴巴中台战略思想与架构实战感想

文章目录 第一章&#xff1a;数据库水平扩展第二章&#xff1a;中台战略第三章&#xff1a;阿里分布式服务架构HSF&#xff08;high speed Framework&#xff09;、早期Dubbo第四章&#xff1a;共享服务中心建设原则第五章&#xff1a;数据拆分实现数据库能力线性扩展第六章&am…

R语言实战——一些批量对地理数据进行操作的方法

各位朋友在进行数据处理时&#xff0c;当有多张栅格影像时&#xff0c;如果我们都要进行同一操作时&#xff0c;一张一张做很繁琐&#xff0c;用ArcGIS模型构建器是一种比较好的方法。当然&#xff0c;今天小编新学了R语言上面进行批量裁剪&#xff0c;一起来学习一下吧&#x…

详解如何创建SpringBoot项目

目录 点击New Project 选择依赖 简单使用SpringBoot 前面已经讲解了如何获取IDEA专业版&#xff0c;下面将以此为基础来讲解如何创建SpringBoot项目。 点击New Project 选择依赖 注意&#xff0c;在选择SpringBoot版本时&#xff0c;不要选择带SNAPSHOT的版本。 这样&#…

点云分割总结

点云分割总结 point transformerbackground 标量自注意力和向量自注意力&#xff08;可参考论文&#xff09;标量自注意力向量注意力 Point Transformer Layer下采样上采样整体结构 point transformer v2group vector attentionPosition Encoding MultiplerPartition-based Poo…

智象未来(HiDream.ai):从科技创新启程,绘制智能未来新篇章

在人工智能领域飞速演进的当下&#xff0c;智象未来&#xff08;HiDream.ai&#xff09;作为全球领先的多模态生成式人工智能技术供应商&#xff0c;正以其独树一帜的视觉多模态大模型及创新应用&#xff0c;推动行业趋势的前进。智象未来&#xff08;HiDream.ai&#xff09;自…

CSP/信奥赛C++刷题训练:经典例题 - 栈(2):洛谷P1981 :[NOIP2013 普及组] 表达式求值

CSP/信奥赛C刷题训练&#xff1a;经典例题 - 栈&#xff08;2&#xff09;&#xff1a;洛谷P1981 &#xff1a;[NOIP2013 普及组] 表达式求值 题目背景 NOIP2013 普及组 T2 题目描述 给定一个只包含加法和乘法的算术表达式&#xff0c;请你编程计算表达式的值。 输入格式 …

LVGL加入外围字库

一、首先lvgl是有自带字库的 lvgl/src/font 如下图 二、但如果这个字库不能满足我们的需求我们就要外建字库。 1、字库生成软件LVGL官网&#xff0c;字体转换器 — LVGL如下图&#xff1a; 最后按“提交”就可以看到有一个字体被下载到你电脑里。他是以.c文件的型式&#xff0…

创新引领,模块化微电网重塑能源格局

根据QYResearch调研团队最新发布的《全球模块化微电网市场报告2023-2029》显示&#xff0c;预计到2029年&#xff0c;全球模块化微电网市场的规模将扩大至33.1亿美元&#xff0c;且在未来几年内&#xff0c;其年复合增长率&#xff08;CAGR&#xff09;将达到8.8%。 如下图所示…

FPGA 第4讲 初识Verilog HDL

时间&#xff1a;2024.11.9 一、学习内容 1.Verilog HDL简介 1.1语言简介 Verilog HDL是一种硬件描述语言&#xff0c;以文本的形式来描述数字系统硬件的结构和行为的语言&#xff0c;用它可以表示逻辑电路图、逻辑表达式&#xff0c;还可以表示数字逻辑系统所完成的逻辑功能…

【51单片机】LED点阵屏 原理 + 使用

学习使用的开发板&#xff1a;STC89C52RC/LE52RC 编程软件&#xff1a;Keil5 烧录软件&#xff1a;stc-isp 开发板实图&#xff1a; 文章目录 LED点阵屏显示原理74HC595 编码LED点阵屏显示笑脸LED点阵屏显示动画 LED点阵屏 点阵屏在开发板的右上角&#xff0c;注意使用前需要…

Chrome扩展是程序员做独立开发的绝佳入场机会

一、开发成本低&#xff0c;难度低 简便灵活&#xff1a;相比开发移动应用&#xff0c;浏览器扩展的开发过程更加简便灵活&#xff0c;更适合初学者。省时省力&#xff1a;通过扩展&#xff0c;你可以修改现有网站的功能&#xff0c;无需从零开始搭建应用&#xff0c;大大节省…

记录一下最近遇到的两个问题

问题1 网友问&#xff1a;一个数据同步的程序之前运行正常&#xff0c;突然数据有问题了&#xff0c;俺的回答是退出杀毒软件 问题是很快解决了&#xff0c;但是网友后来说&#xff0c;客户觉得程序很不稳定。俺不清楚这算不算背锅。 问题2 今天下午&#xff0c;调试着程序蓝…

30.1 时序数据库TSDB的典型特点

本节重点介绍 : db-ranking网站对db进行排名时序数据特点时序数据库特点时序数据库遇到的挑战开源时间序列数据库 db-ranking 一个神奇的网站 https://db-engines.com/en/ranking 时序数据ranking https://db-engines.com/en/ranking/timeseriesdbms 排名方法 https://db-en…

Linux SSH私钥认证结合cpolar内网穿透安全高效远程登录指南

文章目录 前言1. Linux 生成SSH秘钥对2. 修改SSH服务配置文件3. 客户端秘钥文件设置4. 本地SSH私钥连接测试5. Linux安装Cpolar工具6. 配置SSHTCP公网地址7. 远程SSH私钥连接测试8. 固定SSH公网地址9. 固定SSH地址测试 前言 开发人员在工作中经常需要远程访问服务器和数据中心…

vscode摸鱼学习插件开发

不知道大家在摸鱼的时候&#xff0c;会不会想要学习&#xff1f; 或者有没有考公人&#xff0c;下班要学习的&#xff1f; 上班时间摸鱼&#xff0c;下班时间不够学习&#xff1f; 为此&#xff0c;我决定开发一个vscode插件&#xff0c;来刷粉笔题 粉笔插件名称&#xff1a;…

深入浅出WebSocket(实践聊天室demo)

文章目录 什么是WebSocket?WebSocket连接过程WebSocket与Http的区别重连机制完整代码使用方法心跳机制实现聊天室demo(基于Socket.io)参考文章、视频小广告~什么是WebSocket? WebSocket 是一种在单个TCP连接上进行全双工通信的协议(计算机网络应用层的协议) 在 WebSocket A…

[ Linux 命令基础 7 ] Linux 命令详解-磁盘管理相关命令

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

ElasticSearch 添加IK分词器

ElasticSearch 添加IK分词器 前言一、IK分词器的算法二、Ik分词器的下载安装&#xff08;Winows 版本&#xff09;三、Ik分词器的下载安装&#xff08;Linux 版本&#xff09;四、验证测试&#xff08;postman工具&#xff09;测试 ik_smart 分词算法测试 ik_max_word 分词算法…

aws(学习笔记第十一课) 使用AWS的EFS,以及AWS Storage Gateway

aws(学习笔记第十一课) 使用AWS的EFS和AWSStorage Gateway 学习内容&#xff1a; 使用AWS的EFS使用AWS Storage Gateway 1. 使用AWS的EFS 什么是EFS EFS是 Elastic File System的缩写。前面练习的实例存储和EBS都是同时只能一个EC2实例进行挂载&#xff0c;不能实现多个EC2实…