使用汇编优化BCB6的itoa

手把手教你为Multisim 14.0创建自定义元件:以SPICE模型导入为例 本文详细介绍了如何在Multisim 14.0中创建自定义元件,重点讲解了SPICE模型的导入与应用。通过系统性的步骤指南,包括元件符号设计、引脚定义、SPICE模型关联及验证测试,帮助工程师高效扩展元件库,满足特定设计需求。文章还提供了故障排除和性能优化的实用技巧,确保自定义元件在实际仿真中的可靠性。 阅读详情
今天写了个测试itoa性能的程序,做了1千万次itoa操作,主要代码如下:
char buf[64];
unsigned long t = GetTickCount();
for (int i = 0; i <= 10000000; ++i) {
    itoa(i, buf, 10);
}
unsigned long t2 = GetTickCount();
printf("last=%s, %u/n", buf, t2 - t);
 
分别使用VC++2003和C++BUILDER6编译,打开所有速度优化选项,结果发现性能相差很大。
VC最快用了2547ms,BCB最快用了4016ms。想想C运行库应该都是高度优化过的,怎么会有这么大的性能差距呢?
 
为了一探究竟,我翻出了itoa的源码,稍做修改(去掉了正负号处理)代码如下:
void myxtoa (unsigned long val,  char *buf,  unsigned radix)
{
        char *p;                /* pointer to traverse string */
        char *firstdig;         /* pointer to first digit */
        char temp;              /* temp char */
        unsigned digval;        /* value of digit */
        p = buf;
        firstdig = p;           /* save pointer to first digit */
        do {
            digval = (unsigned) (val % radix);
            val /= radix;       /* get next digit */
            /* convert to ascii and store */
            if (digval > 9)
                *p++ = (char) (digval - 10 + 'a');  /* a letter */
            else
                *p++ = (char) (digval + '0');       /* a digit */
        } while (val > 0);
        /* We now have the digit of the number in the buffer, but in reverse
           order.  Thus we reverse them now. */
        *p-- = '/0';            /* terminate string; p points to last digit */
        do {
            temp = *p;
            *p = *firstdig;
            *firstdig = temp;   /* swap *p and *firstdig */
            --p;
            ++firstdig;         /* advance to next two digits */
        } while (firstdig < p); /* repeat until halfway */
}
我使用myxtoa这个函数代替C运行库中的itoa,再编译测试,VC和BCB的编译结果都比原来快了几十毫秒(去掉了符号处理当然快了)。看来BCB对这段代码优化得不如VC好。查看BCB生成的汇编代码后发现,BCB对val /= radix的编译结果是通过存储器读操作数的,没有放到寄存器中。为了测试是该语句影响了性能,将val /= radix语句注释掉,在VC和BCB下重新编译,发现BCB的运行结果居然比VC快了2倍多,看来两个编译器对寄存器变量使用的不同造成了性能上的差异。
 
 为了证实自己的想法,我用汇编重写了myxtoa,用BCB编译,果然现在BCB版本跑的VC一样快了,基本两者都在几毫秒差距间波动。进一步使用__fastcall优化调用后,发现BCB版比VC版快了50-60ms,当然VC也能如此优化。下面是我改写的汇编代码BCB版(VC使用此代码只需对寄存器变量稍做修改即可):
void __fastcall myxtoa (unsigned long val, char *buf, unsigned radix)
{
        __asm {
            mov ebx, edx
            mov esi, ebx
        }
        do {
            __asm {
                xor edx, edx
                div ecx
            }
            if (_EDX > 9) {
                _EDX += ('a' - 10);
            }
            else {
                _EDX += '0';
            }
            __asm mov [ebx], dl
            ++_EBX;
        } while (_EAX > 0);
 
        /* We now have the digit of the number in the buffer, but in reverse
           order.  Thus we reverse them now. */
 
        __asm mov byte ptr [ebx], 0
        --_EBX;
        do {
            __asm {
                mov cl, [ebx]
                mov al, [esi]
                mov [ebx], al
                mov [esi], cl
            }
            --_EBX;
            ++_ESI;
        } while (_ESI < _EBX); /* repeat until halfway */
}
总结,对寄存器变量的优化安排将有效提升程序性能,不过一般这种事情交给C++编译器就可以了,现在PC上的编译器已经足够强了。
 
[网络安全提高篇] 一二〇.恶意软件动态分析经典沙箱Cape批量提取动态API特征 这是作者网络安全自学教程系列,主要是关于安全工具和实践操作的在线笔记,特分享出来与博友们学习,希望您喜欢,一起进步。前文详细介绍动态分析沙箱Cape的安装过程,其是一个开源的自动恶意软件分析系统,通过自动运行和分析恶意软件,全面分析和提取恶意软件的关键特征。然而,当样本数量增加时,单个样本分析会降低效率。这篇文章将讲解如何实现Cape沙箱的批量分析,通过调用Python脚本文件来实施批量处理,并将分析结果存储在指定位置,最后补充submit.py的参数及Python调用方式。基础性文章,希望对您有帮助! 阅读详情

相关推荐

第四节、C# 上位机面向对象编程详解(工控硬件继承实战版)

继承核心价值:在 C# 上位机工控开发中,继承的核心是通用逻辑复用与接口统一,将所有硬件的通用属性 / 方法封装到抽象基类,子类只需实现独有逻辑,大幅减少冗余代码。基类设计要点:优先使用抽象基类,合理分配访问修饰符(privateprotectedpublic),定义通用事件与虚方法,提供资源释放机制,兼顾复用性与扩展性。子类设计要点:通过: base()调用基类构造函数,强制实现抽象方法(保证接口统一),选择性重写虚方法(实现独有逻辑),复用基类的protected成员。多设备管理。

kylezhao2019的博客 787

用汇编实现数字转化为字符串的函数itoa

对于熟悉C语言的大家来说说,itoa这个函数大家一定不会陌生。itoa是广泛应用的非标准C语言扩展函数,它的功能是:将任意类型的数字转换为字符串。 为了更加清楚地让我们知道,如何使用汇编语言来实现这个函数,下面先以用C语言自己实现一个itoa函数,再来说明使用汇编语言实现方法及思想。因为无论是用C语言还是使用汇编语言,其实现思想和方法都是一样的,只是描述的语言不同。但是我们都比较熟悉C语

ljianhui的专栏 1万+

用Python和sklearn预测NBA比赛胜负:从数据清洗到模型优化的完整流程

本文详细介绍了如何使用Python和sklearn构建NBA比赛胜负预测模型,涵盖从数据清洗、特征工程到模型优化与部署的完整流程。通过对比随机森林、XGBoost等主流算法,提供实战技巧和解决方案,帮助数据爱好者掌握体育数据分析的核心技术。

weixin_30823001的博客 133

汇编语言:函数、本地变量、读写、itoa、strlen、malloc、atoi

Table of Contents function.asm build.sh local-variables.asm read-input.asm itoa.asm strlen.asm malloc.asm strcat.asm atoi.asm function.asm ; Simon Whitehead, 2015 ; --------------------- ;...

RToax 1413

用WorkBuddy搭建漫剧AI自动化制作流水线全攻略

在内容创作领域,AI智能体正逐渐从单一工具辅助走向全流程自动化调度。其核心原理是将剧本、分镜、绘图、配音、剪辑等环节拆解为可独立执行的任务单元,由总控系统统一协调,从而大幅降低人力与时间成本。这种模式尤其适用于动态漫画(漫剧)这类环节多、专业度要求高的视频形态。传统制作流程中,角色一致性、配音周期和剪辑返工是公认的效率瓶颈,而借助AI智能体工作台,创作者只需输入故事创意,即可驱动多个数字分身协同完成内容生产。本文以WorkBuddy为例,详细展示如何配置模型、安装技能包并串联五段式流水线,将单集制作成本从万

weixin_28224217的博客 254

Web3前沿技术的智能合约安全审计

随着Web3技术的快速发展,智能合约作为区块链应用的核心组件,其安全性问题日益突出。本文旨在系统性地介绍智能合约安全审计的技术体系,帮助开发者理解智能合约安全风险,掌握安全审计的方法论和工具链。智能合约安全的基本概念常见漏洞类型及其原理安全审计的技术方法实际审计案例分析安全审计工具和资源首先介绍基本概念和背景然后分析常见漏洞和安全风险接着详细讲解安全审计技术提供实际案例和代码示例最后讨论工具资源和未来趋势智能合约:运行在区块链上的自执行程序,代码即法律安全审计。

AI天才研究院 1547

用汇编语言实现itoa函数

近日放假在家,开始研究起汇编语言,看了几日,小有成就。今天晚上有空,写了一个程序,实现C函数库中的itoa()函数的功能,也就是把整数转换成字符串,这是鄙人第一个独立写的汇编程序,肯定有不妥的地方,望高手指正。 ;子程序名:ITOA;功  能:将16位有符号整数转换为字符串;入口参数:DS:SI=缓冲区首地址;AX=要转换的数;出口参数:转换后的字符在缓...

weixin_30797027的博客 411

DPARSF高级版 vs 基础版怎么选?没有T1数据也能做fMRI分析吗?

本文深度对比了DPARSF高级版与基础版在fMRI分析中的核心差异与适用场景,特别针对无T1数据的情况提供了实战解决方案。高级版依赖T1像实现高精度配准,适合需要精确解剖定位的研究;基础版则无需T1数据,适用于功能连接等相对空间要求不高的分析。文章还提供了版本选择决策树和常见问题解决方案,帮助研究者根据实际需求做出最优选择。

weixin_42526087的博客 132

atoi、itoa函数

关于atoi和itoa的初步认识 atoi实现的功能是将字符串转换为整数 搜索帮助文档可得其有关的函数原型 参数str为将转换的字符串。函数返回解释生成的int值类型字符为数字。 了解了它的相关功能后,编写的代码如下: 在这里插入代码片 ...

qq_42441185的博客 358

Android音频学习(一)——音频基础

在系统的学习Android音频之前,先了解音频的基础知识。

miemie2014的博客 1484

Dify 本地插件安装失败?别慌,这篇教程手把手教你解决(解决 the plugin you want to install has a bad signature 报错的问题)

🤯dify安装本地插件报错 PluginDaemonBadRequestError: plugin verification has been enabled, and the plugin you want to install has a bad signature。的解决方案!

XiaoqiangClub的博客 3987

汇编语言学习二

   目前所写的资料主要来源于Jones[1].and.Bartlett.Publishers.Introduction.to.80x86.Assembly.Language.and.Computer.Architecture这本书,主要觉得它比较基础,适合入门,不过还是希望能阅读过http://211.90.241.130:22366/站上的文章和一些相关书籍后有基础的编写和编译能力后再阅读这些

zzljn的专栏 1476

基于LLaMA-action模型的文档摘要任务微调

文档摘要是指从长文档中提取关键信息,生成简短而准确的总结。抽取式摘要:从原文中直接抽取关键句子或短语组成摘要。生成式摘要:通过生成新的句子来表达原文的核心内容。混合式摘要:结合抽取式和生成式方法,既保留原文的关键句子,又生成新的内容。新闻网站:自动生成新闻摘要,帮助用户快速了解新闻要点。社交媒体:为用户提供新闻摘要,便于分享和传播。学术搜索引擎:为用户提供学术文献的摘要,帮助用户快速筛选相关文献。学术写作辅助:帮助研究人员快速生成文献综述部分。企业内部文档管理:自动生成文档摘要,便于员工快速了解文档内容。

加入“Super Entity”,与全能开发团队共探AI智能体与数字人项目,开启前沿技术之旅。 1431

itoa函数

昨天在做 acm的时候,使用 itoa函数将数字转成二进制string,在vs里运行通过但是vjudge(选用了 g++)提交了以后编译器却无法识别。 结论: itoa函数并不是标准库函数,在linux下的g++ 编译器并不支持itoa函数。所以编译器会报错。...

jackcily的博客 915

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

下一篇: 使用mp4v2将aac音频h264视频数据封装成mp4开发心得
yaveymao
博客等级 码龄23年 11粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值