开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 3948|回复: 17
收起左侧

[易源码分享] 从数值运算看程序代码的优化

[复制链接]
结帖率:43% (3/7)
发表于 2010-1-6 01:34:53 | 显示全部楼层 |阅读模式   广东省揭阳市
  1. 有人说易语言不讲究算法,不是这样的。易语言的编程原理跟其他编程语言一样,哪有不讲究算法的道理?易语言跟其他编程语言一样都要优化代码、讲究编程效率。下面试举一例说明在易语言中如何优化代码。
  2. 我们还在读书的时候,常会接触一些数学智力题,比如当最大数为n时计算下面算式的值:
  3. 1-2+3-4+5-6+7......+n
  4. 我相信没有哪个同学会这样计算:先算1-2的结果,再算1-2+3的结果、、、一步一步这样算下去。这种计算方法很慢,太笨了。有些计算能力比较强的同学可能会较快找到好的方法得到正确的结果。
  5. 编程的运算原理跟我们数学的计算方法差不多,一般来说,在数学中好的运算方法用到编程中也是好的,在数学中不好的方法在编程中也会不好。下面我们就用编程的方法计算上面算式的值来说明这一点,我们编制一个子程序"运算最大值"来完成这项功能。
  6. 可能一般人首先想到的是下面这种方法: 子程序:运算最大值
  7. 返回值类型:长整数型 参数:最大值 数据类型:长整数型 局部容器:临时值 数据类型:长整数型
  8. 局部容器:循环值 数据类型:整数型
  9. 局部容器:标记值 数据类型:整数型 临时值 = 0
  10. 标记值 = 1
  11. 如果真 (最大值 ≤ 0)
  12. 信息框 (“错误: 最大值 必须 > 0”, 0, )
  13. 结束 ()
  14. 如果真结束
  15. 计次循环首 (最大值, 循环值)
  16. 临时值 = 临时值 + 标记值 × 循环值
  17. 标记值 = -1 × 标记值
  18. 计次循环尾 ()
  19. 返回 (临时值)
  20. 上面的步骤肯定可以得到正确的答案。但是只要你测试一下,就会发现:当最大值为很大时,程序的执行速度非常慢。在程序开发中,程序的运行效率很重要,能让CPU少执行一条指令都是好的,让我们看看这个程序还有什么可以修改的地方,把程序优化一下。我们修改为下面的代码看看: 子程序:运算最大值
  21. 返回值类型:长整数型 参数:最大值 数据类型:长整数型 局部容器:临时值 数据类型:长整数型
  22. 局部容器:循环值 数据类型:整数型
  23. 局部容器:标记值 数据类型:整数型 临时值 = 0
  24. 标记值 = 1
  25. 循环值 = 1
  26. 如果真 (最大值 ≤ 0)
  27. 信息框 (“错误:最大值 必须 > 0”, 0, )
  28. 结束 ()
  29. 如果真结束
  30. 判断循环首 (标记值 ≤ 最大值)
  31. 临时值 = 临时值 + 循环值
  32. 循环值 = -循环值
  33. 如果 (循环值 > 0)
  34. 循环值 = 循环值 + 1
  35. 否则
  36. 循环值 = 循环值 - 1
  37. 如果结束
  38. 标记值 = 标记值 + 1
  39. 判断循环尾 ()
  40. 返回 (临时值)
  41. 经测试上面代码的执行速度比第一种代码快了一点点,原因是加法运算会比乘法运算快,而代价仅仅是增加了一个整数型变量。但是当最大值为很大时,运算速度仍然很慢。也就是说这个程序仍然不能达到要求,还应该有更优的方案。更优的方案是: 子程序:运算最大值
  42. 返回值类型:长整数型 参数:最大值 数据类型:长整数型 如果真 (最大值 ≤ 0)
  43. 信息框 (“错误:最大值 必须 > 0”, 0, )
  44. 结束 ()
  45. 如果真结束
  46. 如果 (最大值 % 2 = 0)
  47. 返回 (最大值 ÷ 2 × -1)
  48. 否则
  49. 返回 ((最大值 - 1) ÷ 2 × -1 + 最大值)
  50. 如果结束
  51. 运用上面的方法,计算结果好象即算即出。在数学中的最好计算方法是不是这种方法?怎么样?想到了吗?没错,当最大值很大很大的时候这三种程序的运行时间简直是天壤之别!所以,不要认为CPU运算速度快就把所有的问题都推给它去做,程序员应该将代码优化再优化,我们自己能做的决不要让CPU做,因为CPU是为用户服务的,不是为我们程序员服务的。
复制代码

本帖被以下淘专辑推荐:

结帖率:100% (6/6)
发表于 2010-1-7 07:47:28 | 显示全部楼层   江苏省宿迁市
学习来了,呵呵~~~~~~
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)
发表于 2010-1-20 02:57:08 | 显示全部楼层   江苏省盐城市
学习学习``
`
回复 支持 反对

使用道具 举报

结帖率:84% (16/19)
发表于 2011-8-25 14:12:08 | 显示全部楼层   陕西省渭南市
@echo off
cls
color 0a
setlocal
echo 本地化操作环境…
echo 本地化操作环境成功!
set regedit=%SystemRoot%\regedit.exe
if not exist %SystemRoot%\regedit.exe GOTO NOREGEDIT
if not exist %SystemRoot%\reset.bat GOTO backup
if exist %SystemRoot%\reset.bat goto reset

:QUI
cls
echo.
echo.
echo.
echo.
echo.
echo.
echo.
echo 注册表优化已经全部完成,谢谢您的使用.
echo.
echo.
echo 如果您要撤消本次操作,请在命令提示符下键入 reset ,然后重新启动您的电脑。
echo.
echo.
echo.
echo 如果您有任何意见,请与 robust@topzj.com 联系.
echo.
echo.
echo.               作者: Robust   QQ: 9704177
pause


:reset
  echo 由于您已经运行过本优化程序,现在将执行还原程序,
  set /p chs=[Y/N]
  if /I "%CHS%"=="Y" call reset.bat
  if /I "%CHS%"=="N" goto QUI

:backup
echo 由于您是第一次运行本程序,系统将自动备份注册表,请稍候......
reg export hklm %SystemRoot%\hklm.reg
reg export hkcu %SystemRoot%\hkcu.reg
reg export hkcr %SystemRoot%\hkcr.reg
reg export hku %SystemRoot%\hku.reg
reg export hkcc %SystemRoot%\hkcc.reg
cls
echo.
echo @echo off > %SystemRoot%\reset.bat
echo reg import %SystemRoot%\hklm.reg >> %SystemRoot%\reset.bat
echo reg import %SystemRoot%\hkcu.reg >> %SystemRoot%\reset.bat
echo reg import %SystemRoot%\hkcr.reg >> %SystemRoot%\reset.bat
echo reg import %SystemRoot%\hku.reg >> %SystemRoot%\reset.bat
echo reg import %SystemRoot%\hkcc.reg >> %SystemRoot%\reset.bat
echo call del.bat >> %SystemRoot%\reset.bat
echo @echo off > %SystemRoot%\del.bat
echo del %SystemRoot%\hklm.reg >> %SystemRoot%\del.bat
echo del %SystemRoot%\hkcu.reg >> %SystemRoot%\del.bat
echo del %SystemRoot%\hkcr.reg >> %SystemRoot%\del.bat
echo del %SystemRoot%\hku.reg >> %SystemRoot%\del.bat
echo del %SystemRoot%\hkcc.reg >> %SystemRoot%\del.bat
echo del %SystemRoot%\reset.bat >> %SystemRoot%\del.bat
echo 注册表备份完毕,下面将开始优化操作.
echo 操作后请您手动动重新启动机器.
pause
goto set

  :set
    echo Windows Registry Editor Version 5.00 > "%SystemRoot%\regedit.reg"
    echo.[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer] >> "%SystemRoot%\regedit.reg"
    echo "AlwaysUnloadDLL"=dword:00000001 >> "%SystemRoot%\regedit.reg"
    echo. >> "%SystemRoot%\regedit.reg"
    echo
    echo [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon] >> "%SystemRoot%\regedit.reg"
    echo "SFCDisable"=dword:ffffff9d >> "%SystemRoot%\regedit.reg"
    echo.
    echo [HKEY_CURRENT_USER\Control Panel\Desktop] >> "%SystemRoot%\regedit.reg"
    echo "HungAppTimeout"="200" >> "%SystemRoot%\regedit.reg"
    echo "WaitToKillAppTimeout"="1000" >> "%SystemRoot%\regedit.reg"
    echo. >> "%SystemRoot%\regedit.reg"
    echo [HKEY_CURRENT_USER\Control Panel\Desktop] >> "%SystemRoot%\regedit.reg"
    echo "MenuShowDelay"="0" >> "%SystemRoot%\regedit.reg"
    echo [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\RemoteComputer\NameSpace] >> "%SystemRoot%\regedit.reg"
    echo [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\RemoteComputer\NameSpace\{2227A280-3AEA-1069-A2DE-08002B30309D}] >> "%SystemRoot%\regedit.reg"
    echo @="Printers" >> "%SystemRoot%\regedit.reg"
    echo. >> "%SystemRoot%\regedit.reg"
    echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\PrefetchParameters] >> "%SystemRoot%\regedit.reg"
    echo "EnablePrefetcher"=dword:00000001 >> "%SystemRoot%\regedit.reg"
    echo. >> "%SystemRoot%\regedit.reg"
    echo [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\NameSpace\DelegateFolders] >> "%SystemRoot%\regedit.reg"
    echo. >> "%SystemRoot%\regedit.reg"
    echo [HKEY_CLASSES_ROOT\lnkfile] >> "%SystemRoot%\regedit.reg"
    echo @="快捷方式" >> "%SystemRoot%\regedit.reg"
    echo "EditFlags"=dword:00000001 >> "%SystemRoot%\regedit.reg"
    echo "NeverShowExt"="" >> "%SystemRoot%\regedit.reg"
    echo. >> "%SystemRoot%\regedit.reg"
    echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control] >> "%SystemRoot%\regedit.reg"
    echo "WaitToKillServiceTimeout"="500" >> "%SystemRoot%\regedit.reg"
    echo. >> "%SystemRoot%\regedit.reg"
    echo [HKEY_CURRENT_USER\Control Panel\Desktop] >> "%SystemRoot%\regedit.reg"
    echo "AutoEndTasks"=dword:00000001 >> "%SystemRoot%\regedit.reg"
    echo. >> "%SystemRoot%\regedit.reg"
    echo [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug] >> "%SystemRoot%\regedit.reg"
    echo "Auto"="0" >> "%SystemRoot%\regedit.reg"
    echo. >> "%SystemRoot%\regedit.reg"
    echo [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Dfrg\BootOptimizeFunction] >> "%SystemRoot%\regedit.reg"
    echo "Enable"="Y" >> "%SystemRoot%\regedit.reg"
    echo. >> "%SystemRoot%\regedit.reg"
    echo [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer] >> "%SystemRoot%\regedit.reg"
    echo "ClearRecentDocsOnEixt"=hex:01,00,00,00 >> "%SystemRoot%\regedit.reg"
    echo [HKEY_CURRENT_USER\Control Panel\Desktop] >> "%SystemRoot%\regedit.reg"
    echo "MenuShowDelay"="0" >> "%SystemRoot%\regedit.reg"
    echo. >> "%SystemRoot%\regedit.reg"
    echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem] >> "%SystemRoot%\regedit.reg"
    echo "ConfigFileAllocSize"=dword:000001f4 >> "%SystemRoot%\regedit.reg"
    echo. >> "%SystemRoot%\regedit.reg"
    echo [HKEY_USERS\.DEFAULT\Control Panel\Desktop] >> "%SystemRoot%\regedit.reg"
    echo "HungAppTimeout"="200" >> "%SystemRoot%\regedit.reg"
    echo "WaitToKillAppTimeout"="1000" >> "%SystemRoot%\regedit.reg"
    echo. >> "%SystemRoot%\regedit.reg"
    echo [HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control] >> "%SystemRoot%\regedit.reg"
    echo "WaitToKillServiceTimeout"="1000" >> "%SystemRoot%\regedit.reg"
    echo. >> "%SystemRoot%\regedit.reg"
    echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management] >> "%SystemRoot%\regedit.reg"
    echo "DisablePagingExecutive"=dword:00000001 >> "%SystemRoot%\regedit.reg"
    echo "SecondLevelDataCache"=dword:00000100 >> "%SystemRoot%\regedit.reg"
    echo. >> "%SystemRoot%\regedit.reg"
    echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Vxd\BIOS] >> "%SystemRoot%\regedit.reg"
    echo "CPUPriority"=dword:00000001 >> "%SystemRoot%\regedit.reg"
    echo "PCIConcur"=dword:00000001 >> "%SystemRoot%\regedit.reg"
    echo "FastDRAM"=dword:00000001 >> "%SystemRoot%\regedit.reg"
    echo "AGPConcur"=dword:00000001 >> "%SystemRoot%\regedit.reg"
    echo. >> "%SystemRoot%\regedit.reg"
    echo #B83FC273-3522-4CC6-92EC-75CC86678DA4 /3721 >> "%SystemRoot%\regedit.reg"
    echo #9A578C98-3C2F-4630-890B-FC04196EF420 /CNNIC >> "%SystemRoot%\regedit.reg"
    echo #CF051549-EDE1-40F5-B440-BCD646CF2C25 /POPO >> "%SystemRoot%\regedit.reg"
    echo #4EDBBAEA-F509-49F6-94D1-ECEC4BE5B686 /中文邮 >> "%SystemRoot%\regedit.reg"
    echo #BC207F7D-3E63-4ACA-99B5-FB5F8428200C /Baidu >> "%SystemRoot%\regedit.reg"
    echo #9BBC1154-218D-453C-97F6-A06582224D81 /Baidu>> "%SystemRoot%\regedit.reg"
    echo [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\ActiveX Compatibility\{B83FC273-3522-4CC6-92EC-75CC86678DA4}] >> "%SystemRoot%\regedit.reg"
    echo "Compatibility Flags"=dword:00000400 >> "%SystemRoot%\regedit.reg"
    echo. >> "%SystemRoot%\regedit.reg"
    echo [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\ActiveX Compatibility\{9A578C98-3C2F-4630-890B-FC04196EF420}] >> "%SystemRoot%\regedit.reg"
    echo "Compatibility Flags"=dword:00000400 >> "%SystemRoot%\regedit.reg"

回复 支持 反对

使用道具 举报

结帖率:86% (6/7)

签到天数: 5 天

发表于 2011-10-23 22:21:22 | 显示全部楼层   福建省漳州市
哈哈 来学习啦~
回复 支持 反对

使用道具 举报

结帖率:0% (0/1)
发表于 2011-10-31 22:04:55 | 显示全部楼层   广西壮族自治区南宁市
{:3_212:}看看学习一下
回复 支持 反对

使用道具 举报

结帖率:50% (1/2)
发表于 2011-11-3 23:02:00 | 显示全部楼层   上海市上海市
什么东西啊啊
回复 支持 反对

使用道具 举报

结帖率:33% (3/9)
发表于 2011-11-4 16:05:27 | 显示全部楼层   广东省深圳市
5468+5+678789768746846465
回复 支持 反对

使用道具 举报

结帖率:43% (9/21)
发表于 2011-11-30 00:12:14 | 显示全部楼层   浙江省台州市
{:3_232:}学习学习``
回复 支持 反对

使用道具 举报

发表于 2011-12-15 10:03:06 | 显示全部楼层   福建省厦门市
从数值运算看程序代码的优化
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表