文本首发bIlibilicnblogs为作者补发,如在其他平台看见本文,均为经允许的盗窃

易语言作为款主打 中文 易用 编程的开发软件。但是很多人都在批评易语言的效率。

我们今天通过 质数和计算 来看看易语言的效率到底与C++差了多少。

话不多说,这是今天的测试平台

  1. C++部分
  2. 开发环境VC++ 2019
  3. Release x86
  4. 代码优化为 /O2

C++代码(原本V2IDX是内联的,但是易语言不支持,为了达到一样的效果,我取消了)

其余微小差异均已忽略

代码源自知乎大神@wjhbb

原帖

  1. #include <math.h>
  2. #include <stdio.h>
  3. #include <assert.h>
  4. #include <iostream>
  5. #include <windows.h>
  6. #define LINT long long
  7. LINT V2IDX(LINT v, LINT N, LINT Ndr, LINT nv) {
  8. return v >= Ndr ? (N / v - 1) : (nv - v);
  9. }
  10. LINT primesum(LINT N) {
  11. LINT* S;
  12. LINT* V;
  13. LINT r = (LINT)sqrt(N);
  14. LINT Ndr = N / r;
  15. assert(r * r <= N and (r + 1) * (r + 1) > N);
  16. LINT nv = r + Ndr - 1;
  17. V = new LINT[nv];
  18. S = new LINT[nv];
  19. for (LINT i = 0; i < r; i++) {
  20. V[i] = N / (i + 1);
  21. }
  22. for (LINT i = r; i < nv; i++) {
  23. V[i] = V[i - 1] - 1;
  24. }
  25. for (LINT i = 0; i < nv; i++) {
  26. S[i] = V[i] * (V[i] + 1) / 2 - 1;
  27. }
  28. for (LINT p = 2; p <= r; p++) {
  29. if (S[nv - p] > S[nv - p + 1]) {
  30. LINT sp = S[nv - p + 1];
  31. LINT p2 = p * p;
  32. for (LINT i = 0; i < nv; i++) {
  33. if (V[i] >= p2) {
  34. S[i] -= p * (S[V2IDX(V[i] / p, N, Ndr, nv)] - sp);
  35. }
  36. else {
  37. break;
  38. }
  39. }
  40. }
  41. }
  42. return S[0];
  43. }
  44. int main() {
  45. using std::cin;
  46. printf("请输入您要求的质数和的上限:" );
  47. LINT N ;
  48. cin >> N;
  49. int t = GetTickCount();
  50. printf("%lld\n", primesum(N));
  51. printf("耗时(ms)%u", GetTickCount() - t);
  52. cin >> N;
  53. }

易语言部分

  1. 开发环境 易语言5.9
  2. 分别比较 动态编译 静态编译(VC98Linker) 黑月编译(VC14.23Linker,C/C++方式编译)
  3. 开启快速数组访问,不插入花指令,不打乱编译结果.
  1. ​.版本 2
  2. .程序集 Main
  3. .子程序 _启动子程序, 整数型, , 本子程序在程序启动后最先执行
  4. .局部变量 N, 长整数型
  5. .局部变量 t, 整数型
  6. 标准输出 (, “请输入您要求的质数和的上限:”)
  7. N 到长整数 (标准输入 ())
  8. t GetTickCount ()
  9. 标准输出 (, 到文本 (Primesum (N)) #换行符)
  10. 标准输出 (, “耗时(ms)” 到文本 (GetTickCount () t))
  11. 标准输入 ()
  12. 返回 (0) ' 可以根据您的需要返回任意数值
  13. .子程序 V2IDX, 长整数型
  14. .参数 V, 长整数型
  15. .参数 N, 长整数型
  16. .参数 Ndr, 长整数型
  17. .参数 nv, 长整数型
  18. .如果真 (V ≥ Ndr)
  19. 返回 (N ÷ V - 1)
  20. .如果真结束
  21. 返回 (nv - V)
  22. .版本 2
  23. .子程序 Primesum, 长整数型
  24. .参数 N, 长整数型
  25. .局部变量 S, 长整数型, , "0"
  26. .局部变量 V, 长整数型, , "0"
  27. .局部变量 r, 长整数型
  28. .局部变量 Ndr, 长整数型
  29. .局部变量 nv, 长整数型
  30. .局部变量 i, 长整数型
  31. .局部变量 p, 长整数型
  32. .局部变量 sp, 长整数型
  33. .局部变量 p2, 长整数型
  34. r = 求平方根 (N)
  35. Ndr = N ÷ r
  36. nv = r + Ndr - 1
  37. 重定义数组 (V, 假, nv)
  38. 重定义数组 (S, 假, nv)
  39. i = 0
  40. .判断循环首 (i < r)
  41. V [i + 1] = N ÷ (i + 1)
  42. i = i + 1
  43. .判断循环尾 ()
  44. i = r
  45. .判断循环首 (i < nv)
  46. V [i + 1] = V [i] - 1
  47. i = i + 1
  48. .判断循环尾 ()
  49. i = 0
  50. .判断循环首 (i < nv)
  51. S [i + 1] = V [i + 1] × (V [i + 1] + 1) ÷ 2 - 1
  52. i = i + 1
  53. .判断循环尾 ()
  54. p = 2
  55. .判断循环首 (p ≤ r)
  56. .如果真 (S [nv - p + 1] > S [nv - p + 2])
  57. sp = S [nv - p + 2]
  58. p2 = p × p
  59. i = 0
  60. .判断循环首 (i < nv)
  61. .如果 (V [i + 1] ≥ p2)
  62. S [i + 1] = S [i + 1] - p × (S [V2IDX (V [i + 1] ÷ p, N, Ndr, nv) + 1] - sp)
  63. .否则
  64. 跳出循环 ()
  65. .如果结束
  66. i = i + 1
  67. .判断循环尾 ()
  68. .如果真结束
  69. p = p + 1
  70. .判断循环尾 ()
  71. 返回 (S [1])

UP翻译的代码不是很好,欢迎大家指正.

PS:GetTickCount()得到的时间差可能不会很准.,同时我也承认这样比较方法的不严谨性,所以测试结果仅供参考.

顺带提一下电脑CPU是i7-7700k

编译生成后

可以发现C++的体积是最小的(易语言动态编译的还要带几个支持库文件)

先从一亿以内的质数开始

可以发现他们之间的速度差距

当我们提高计算量时,我们会惊人的发现 易语言程序算错了

例如知乎上的10亿

UP尝试发现原因,觉得可能是一下几点

  1. UP技术太垃圾翻译了
  2. UP主的盗版易语言的暗装没清干净
  3. 易语言的数组只支持到INT的成员数
  4. 易语言的数值转换问题

请大神们看看是什么情况.UP也不好妄下定论。

但是起码证明了一点,没有不好的编程语言,只有效率低下的算法,在1亿以内易语言还是有准确性的.如果其他编程语言用的算法比易语言低效,那也不见的比易语言快的.(UP用的算法也不一定是最快的算法).易语言作为一个怡情使用的开发软件还是很不错的.

听说易语言创始人吴涛将要为他的火山开发平台添加PC端的开发功能,让我们拭目以待.(UP在考虑要不要要火山上补个票)

易语言效率与C++究竟差多少(质数和计算)的更多相关文章

  1. 执行效率做比较,Go、python、java、c#、delphi、易语言等

    比较环境,在win7   64位,比较各种语言的整数型运算,下面的比较只作为单项比较.具体方式,40000*40000遍历相加.为了防止编译器优化,生成一个随机数. 1:c#,在NET2.0框架下作为 ...

  2. C++ 编写DLL文件给易语言调用

    摸索了两天了,终于解决了所有问题,在此跟大家分享. 需要三个文件,dll_demo.h.dll_demo.cpp.dll_dome.def 直接上代码: 头文件如下: #ifndef _DLL_DEM ...

  3. 在易语言中调用MS SQL SERVER数据库存储过程方法总结

    Microsoft SQL SERVER 数据库存储过程,根据其输入输出数据,笼统的可以分为以下几种情况或其组合:无输入,有一个或多个输入参数,无输出,直接返回(return)一个值,通过output ...

  4. 易语言5.6 精简破解版[Ctoo]

    说明:本易语言5.6破解版 加入了[E剑终情]大神制作的完美通杀补丁,本人还修复了静态编译的问题. 关于静态编译失效的问题,大家解压之后会看到易语言根目录有一个"易言语静态编译配置工具&qu ...

  5. 易语言软件加VMProtect壳的正确方法

    VMP是一款很强大的加密壳,代码虚拟化技术可以很好的保护程序不被恶意修改破J但是很多人不知道怎么给自己的程序加壳,今天给大家晋级下加壳的正确方法 相信很多新手都以为只要把软件直接拖到VMP里重新编译一 ...

  6. Windows2003/2008/2008 R2下易语言点支持库配置就退出的问题

    问题: 请问一个问题,我的电脑上win2003系统的,安装了易语言后,一点支持库配置就会自动退出.这是为什么啊? 解决方法如下: 删除 lib下的wmp.npk,重新打开易语言就可以了.

  7. 易语言转C#小试牛刀

    呵呵,用了几年的易语言,太郁闷了,玩过E的童鞋们懂得,偶然机会尝试C#,现正式投入C#门下. 我会把我学习C#的一些知识和重点,实时发不到我的BLOG中,同想学习C#的童鞋一起成长起来.

  8. 幻世(OurDream)2D图形引擎易语言汉化版更新提示

    幻世引擎的易语言汉化专版到目前为止已经累积了多个BUG,其中多个BUG是影响引擎功能使用的问题,我将会在近期发布修复所有问题的更新版本(此更新版本同时也将会支持最新的对加入的粒子系统的支持),敬请各位 ...

  9. 易语言 【寻找文本】命令的bug

    最近在重写易语言模块的时候,在取子文本操作时老是出错,经常出现一些奇怪的问题,一开始以为是代码问题,可是找半天硬是找不到问题所在. 于是进入了找bug模式,这么几行代码,看了我半个小时,左改右改,总感 ...

随机推荐

  1. Linux中的chkconfig

    chkconfig是用来查看开机自启动项目的命令.默认列出linux系统开机自启的项目.平时我们使用时习惯加上--list 从这个图中可以看到当前系统有哪些开机启动项目,就是红色框中的on. 那么怎么 ...

  2. Linux系统安装-C7

    1.安装部署操作系统 (1)创建虚拟机,加载系统镜像 (2)进入系统引导界面进行配置 补充:centos7系统网卡名称 默认系统的网卡名称为 eth0 eth1 –centos6 默认系统的网卡名称为 ...

  3. My Idol:Beihai Zhang --<<The Three-body Problem>>

    First 父:"要多想." 子:"想了之后呢?" 父:"北海,我只能告诉你在那以前要多想." 要多想--这场战争敌我力量对比过于悬殊,硬碰 ...

  4. 【面试】详解同步/异步/阻塞/非阻塞/IO含义与案例

    本文详解同步.异步.阻塞.非阻塞,以及IO与这四者的关联,毕竟我当初刚认识这几个名词的时候也是一脸懵. 目录 1.同步阻塞.同步非阻塞.异步阻塞.异步非阻塞 1.同步 2.异步 3.阻塞 4.非阻塞 ...

  5. php+redis实现全页缓存系统

    php redis 实现全页缓存系统之前的一个项目说的一个功能,需要在后台预先存入某个页面信息放到数据库,比如app的注册协议,用户协议,这种.然后在写成一个php页面,app在调用接口的时候访问这个 ...

  6. Nacos配置中心功能

    目录 Nacos的配置管理模型 命名空间(Namespace) 配置分组(Group) 配置集(Data ID) 配置项 一个最佳实践 命名空间管理 配置管理 参考 Nacos的配置管理模型 对于Na ...

  7. 浅谈C++11中的多线程(三)

    摘要 本篇文章围绕以下几个问题展开: 进程和线程的区别 何为并发?C++中如何解决并发问题?C++中多线程的基本操作 浅谈C++11中的多线程(一) - 唯有自己强大 - 博客园 (cnblogs.c ...

  8. Java | 字符串缓冲区(StringBuilder)

    为什么要出现字符缓冲区 我们都知道,String类是不可变的,但是有的时候,我们要用到字符串的拼接,如果拼接的数量小的时候,还可以,但是如果拼接的数据量太大的话,内存的占用就太大了,所以这个时候再用S ...

  9. NSIS 插件开发引发的思考

    支持NSIS的DLL扩展编程通用语法结构 #include <windows.h> #include <stdio.h> #define FORCE_SWITCH " ...

  10. QT. 学习之路 三

    添加一个动作: Qt 使用QAction类作为动作.QAction包含了图标.菜单文字.快捷键.状态栏文字.浮动帮助等信息.当把一个QAction对象添加到程序中时,Qt 自己选择使用哪个属性来显示, ...