C语言和DELPHI的整体效率比较
1 个月前
{*****************************************************************************
*目的: 通过此程序,检验DELPHI和C语言的整体运算效率
*描述: 此循序包含:数组、指针、随机数生成、数字和字符串转换、常用数学运算、
* 字符串拷贝、长度和比较运算等,
* 能比较整体反应DLEPHI 和 C语言的常规运算效率
* C的最优势就是指针运算,为此本程序也要求DELPHI必须跟C一样,采用C的风格和类型,
* 比如字符串,也采用C的风格,用数组来处理字符串,而不是采用原生的STRING,力求公平.
*整体算法:1)产生一个TNODE类型的数组,并进行初始赋值和产生随机数
* 2)申请内存空间
3)执行过程运算:通过指针的移动和处理,把数组数据拷贝到内存,进行各种的字符串和数学运算
4)释放内存空间
5)循环2-4步骤,执行N次循环
******************************************************************************}
执行环境:64位编译器,WINDOWS10
DELPHI编译器是XE 10.4
C编译器是MS VC 19.31
以下是DELPHI代码:
{$apptype console}
{$pointermath on}
program pointer_process;
uses system.sysutils,winapi.windows,system.math;
const
NUM = 1000000; //数组长度
TNode = record
value:nativeint; //数值
str:array[0..19] of char; //字符数组
str_len:nativeint; //数组字符串长度
rand_num:nativeint; //随机数
div_num:nativeint; //随机数取整数
is_even:nativeint; //随机数是否偶数
math_value:double; //随机数的数学运算值
Tarr = array[0 .. NUM - 1] of TNode; //TNODE数组类型
cnt: nativeint = 0; //循环数统计
gsum_strlen: nativeint = 0; //Tnode.str字符串长度汇总
i: nativeint;
g_arr: Tarr; //数组
pmem,p,q: ^Tnode; //TNODE类型指针
s_time, e_time: cardinal;//起始时间和结束时间
function pointer_proc(var varr: Tarr): nativeint;
i:double;
begin
result := 0;
p := @varr;
q := pmem;
while p^.value <> -1 do
begin
//通过指针移动,引用和解引用,拷贝数组元素数据到内存块,并计算字符串长度
//考察其指针运算和字符串处理效率
q^.value := p^.value;
strcopy(q^.str, p^.str);
q^.str_len := strlen(q^.str);
q^.rand_num := p^.rand_num;
//计算和处理随机数值,对其进行取整,取模,移位以及常用的数学运算,
//计算公式本身没有实际意义,仅考察其数字运算能力
q^.div_num := q^.rand_num div 2;
if q^.rand_num mod 2 = 0 then q^.is_even := 1 else q^.is_even := 0;
i := 1 + q^.rand_num shr 2;
q^.math_value := ceil(abs(2 * i - 7 * i) / (i * 4 + 1) + sin(i) + power(i, 2) + round(i/2.3) + log10(i) + sqrt(i));
result := result + q^.str_len; //汇总字符串长度
inc(cnt); inc(p); inc(q);
//对来源和目的的数值,字符串进行检查和比较,是否有错误,
//考察其字符串运算能力
p := @varr;
q := Pmem;
while p^.value <> -1 do
begin
if q^.value <> p^.value then
begin
writeln('value not equ! ');
abort;
if q^.rand_num <> p^.rand_num then
begin
writeln('rand num not equ! ');
abort;
if strcomp(q^.str, p^.str) <> 0 then
begin
writeln('str not equ! ');
abort;
inc(cnt) ; inc(p); inc(q);
begin
WriteLn('Delphi: TNode size = ',sizeof(TNode), ' char size = ',sizeof(char),' pointer size = ',sizeof(pmem));
s_time := GetTickCount();
//初始数组相关数值,数字转换为字符串,并存储到字段
//产生随机数
randomize;
for i := 0 to num - 1 do
begin
g_arr[i].value := i;
strPcopy(g_arr[i].str, inttostr(i));
g_arr[i].rand_num := 1000 + random(999);
g_arr[i - 1].value := -1;
//申请和释放指针内存,并循环执行过程运算
for i := 0 to 999 do
begin
getmem(pmem, num * sizeof(TNode));
gsum_strlen := gsum_strlen + pointer_proc(g_arr);
freemem(pmem);
e_time := GetTickCount();
WriteLn('str len sum = ', gsum_strlen , ' loop count = ',cnt,' total time = ' , e_time - s_time,' ms');
//计算和处理随机数值,对其进行取整,取模,移位以及常用的数学运算,
//计算公式本身没有实际意义,仅考察其数字运算能力
q->div_num = (int)(q->rand_num / 2);
q->is_even = (q->rand_num % 2 == 0) ? 1: 0;
i = 1 + q->rand_num >> 2;
q->math_value = ceil(abs(2 * i - 7 * i) / (i * 4 + 1) + sin(i) + pow(i, 2) + round(i/2.3) + log10(i) + sqrt(i));
result += q->str_len; //汇总字符串长度
cnt++; p++; q++;
//对来源和目的的数值,字符串进行检查和比较,是否有错误,
//考察其字符串运算能力
p = varr;
q = pmem;
while (p->value != -1) {
if (p->value != q->value){
printf("value not equ! \n");
exit(1);
if (p->rand_num != q->rand_num){
printf("rand num not equ! \n");
exit(1);
if(wcscmp(p->str,q->str) != 0){
printf("str not equ! \n");
exit(1);
cnt++; p++; q++;
return result;
void main(int argc, char* argv[]) {
printf("C-lang: TNode size = %zd wchar_t size = %zd pointer size= %zd\n",sizeof(TNode),sizeof(wchar_t),sizeof(pmem));
s_time = GetTickCount();
//初始数组相关数值,数字转换为字符串,并存储到字段
//产生随机数
srand((unsigned long )time(NULL));
for(i = 0; i <= NUM - 1; i++ ) {
g_arr[i].value = i;
_ltow_s(i, g_arr[i].str,sizeof(g_arr[i].str)/sizeof(WCHAR) ,10);
g_arr[i].rand_num = rand() % 999 + 1000;
g_arr[i - 1].value = -1;
//申请和释放指针内存,并循环执行过程运算
for (i = 0; i <= 999; i++ ){
pmem = (TNode *)malloc(NUM * sizeof(TNode));
gsum_strlen += pointer_proc(g_arr);
free(pmem);
e_time = GetTickCount();
printf("str len sum = %lld loop count = %lld total time = %lu ms \n", gsum_strlen, cnt,(unsigned long)(e_time - s_time));
return;
多次执行运算后比较,大体8%左右的差距,C语言比DELPHI快8%左右,二者效率差异,基本可以忽略。
DELPHI的执行时间:
D:\testlang\delphi>pointer_pas.exe
Delphi: TNode size = 88 char size = 2 pointer size = 8
str len sum = 5888884000 loop count = 1999998000 total time = 134609 ms
D:\testlang\delphi>