淮阴老兵 發表於 2021-8-13 08:10:00

易语言效率与C++究竟差多少(质数和计算)

<blockquote>
<p><strong>文本首发bIlibili,cnblogs为作者补发,如在其他平台看见本文,均为未经允许的盗窃</strong></p>
</blockquote>
<blockquote>
<p>易语言作为款主打 中文 易用 编程的开发软件。但是很多人都在批评易语言的效率。<br>
我们今天通过 质数和计算 来看看易语言的效率到底与C++差了多少。</p>
</blockquote>
<p>话不多说,这是今天的测试平台</p>
<ol>
<li>C++部分</li>
<li>开发环境VC++ 2019</li>
<li>Release x86</li>
<li>代码优化为 /O2</li>
</ol>
<p>C++代码(原本V2IDX是内联的,但是易语言不支持,为了达到一样的效果,我取消了)<br>
其余微小差异均已忽略</p>
<p>代码源自知乎大神@wjhbb<br>
原帖</p>
<pre><code class="language-cpp">#include &lt;math.h&gt;
#include &lt;stdio.h&gt;
#include &lt;assert.h&gt;
#include &lt;iostream&gt;
#include &lt;windows.h&gt;
#define LINT long long

LINT V2IDX(LINT v, LINT N, LINT Ndr, LINT nv) {

   return v &gt;= Ndr ? (N / v - 1) : (nv - v);
}

LINT primesum(LINT N) {

    LINT* S;
    LINT* V;
    LINT r = (LINT)sqrt(N);
    LINT Ndr = N / r;
    assert(r * r &lt;= N and (r + 1) * (r + 1) &gt; N);
    LINT nv = r + Ndr - 1;
   V = new LINT;
    S = new LINT;
    for (LINT i = 0; i &lt; r; i++) {
      V = N / (i + 1);
    }
    for (LINT i = r; i &lt; nv; i++) {
      V = V - 1;
    }
    for (LINT i = 0; i &lt; nv; i++) {
      S = V * (V + 1) / 2 - 1;
    }
    for (LINT p = 2; p &lt;= r; p++) {
      if (S &gt; S) {
            LINT sp = S;
            LINT p2 = p * p;
            for (LINT i = 0; i &lt; nv; i++) {
                if (V &gt;= p2) {
                  S -= p * (S / p, N, Ndr, nv)] - sp);
                }
                else {
                  break;
                }
            }
      }
    }
    return S;
}

int main() {
    using std::cin;
    printf("请输入您要求的质数和的上限:" );
    LINT N ;
    cin &gt;&gt; N;
    int t = GetTickCount();
    printf("%lld\n", primesum(N));
    printf("耗时(ms)%u", GetTickCount() - t);
    cin &gt;&gt; N;
}
</code></pre>
<p>易语言部分</p>
<ol>
<li>开发环境 易语言5.9</li>
<li>分别比较 动态编译 静态编译(VC98Linker)黑月编译(VC14.23Linker,C/C++方式编译)</li>
<li>开启快速数组访问,不插入花指令,不打乱编译结果.</li>
</ol>
<pre><code class="language-vb">​.版本 2

.程序集 Main

.子程序 _启动子程序, 整数型, , 本子程序在程序启动后最先执行
.局部变量 N, 长整数型
.局部变量 t, 整数型

标准输出 (, “请输入您要求的质数和的上限:”)
N = 到长整数 (标准输入 ())
t = GetTickCount ()
标准输出 (, 到文本 (Primesum (N)) + #换行符)
标准输出 (, “耗时(ms)” + 到文本 (GetTickCount () - t))
标准输入 ()
返回 (0)' 可以根据您的需要返回任意数值

.子程序 V2IDX, 长整数型
.参数 V, 长整数型
.参数 N, 长整数型
.参数 Ndr, 长整数型
.参数 nv, 长整数型

.如果真 (V ≥ Ndr)
    返回 (N ÷ V - 1)
.如果真结束
返回 (nv - V)
.版本 2

.子程序 Primesum, 长整数型
.参数 N, 长整数型

.局部变量 S, 长整数型, , "0"
.局部变量 V, 长整数型, , "0"
.局部变量 r, 长整数型
.局部变量 Ndr, 长整数型
.局部变量 nv, 长整数型
.局部变量 i, 长整数型
.局部变量 p, 长整数型
.局部变量 sp, 长整数型
.局部变量 p2, 长整数型

r = 求平方根 (N)

Ndr = N ÷ r

nv = r + Ndr - 1

重定义数组 (V, 假, nv)
重定义数组 (S, 假, nv)

i = 0

.判断循环首 (i < r)
    V = N ÷ (i + 1)
    i = i + 1

.判断循环尾 ()

i = r

.判断循环首 (i < nv)
    V = V - 1
    i = i + 1
.判断循环尾 ()

i = 0

.判断循环首 (i < nv)
    S = V × (V + 1) ÷ 2 - 1
    i = i + 1
.判断循环尾 ()

p = 2

.判断循环首 (p ≤ r)
    .如果真 (S > S )
      sp = S
      p2 = p × p
      i = 0

      .判断循环首 (i < nv)
            .如果 (V ≥ p2)
                S = S - p × (S ÷ p, N, Ndr, nv) + 1] - sp)
            .否则
                跳出循环 ()
            .如果结束
            i = i + 1
      .判断循环尾 ()
    .如果真结束
    p = p + 1
.判断循环尾 ()
返回 (S )
</code></pre>
<p>UP翻译的代码不是很好,欢迎大家指正.</p>
<p><strong>PS:GetTickCount()得到的时间差可能不会很准.,同时我也承认这样比较方法的不严谨性,所以测试结果仅供参考.</strong></p>
<p>顺带提一下电脑CPU是i7-7700k</p>
<p>编译生成后<br>
<img src="https://img2020.cnblogs.com/blog/2468061/202108/2468061-20210813080257727-1449559117.png" alt="可以发现C++的体积是最小的(易语言动态编译的还要带几个支持库文件)" loading="lazy"></p>
<blockquote>
<p>可以发现C++的体积是最小的(易语言动态编译的还要带几个支持库文件)</p>
</blockquote>
<p>先从一亿以内的质数开始<br>
<img src="https://img2020.cnblogs.com/blog/2468061/202108/2468061-20210813080334002-917473062.png" alt="可以发现他们之间的速度差距" loading="lazy"></p>
<blockquote>
<p>可以发现他们之间的速度差距</p>
</blockquote>
<p>当我们提高计算量时,我们会惊人的发现 易语言程序算错了<br>
例如知乎上的10亿</p>
<p><img src="https://img2020.cnblogs.com/blog/2468061/202108/2468061-20210813080441362-765979703.png" alt="易语言算的慢也就算了,关键还是不精确的" loading="lazy"></p>
<p>UP尝试发现原因,觉得可能是一下几点</p>
<ol>
<li>UP技术太垃圾翻译了</li>
<li>UP主的盗版易语言的暗装没清干净</li>
<li>易语言的数组只支持到INT的成员数</li>
<li>易语言的数值转换问题</li>
</ol>
<p>请大神们看看是什么情况.UP也不好妄下定论。</p>
<blockquote>
<p>但是起码证明了一点,没有不好的编程语言,只有效率低下的算法,在1亿以内易语言还是有准确性的.如果其他编程语言用的算法比易语言低效,那也不见的比易语言快的.(UP用的算法也不一定是最快的算法).易语言作为一个怡情使用的开发软件还是很不错的.<br>
听说易语言创始人吴涛将要为他的火山开发平台添加PC端的开发功能,让我们拭目以待.(UP在考虑要不要要火山上补个票)</p>
</blockquote><br><br>
来源:https://www.cnblogs.com/Icys/p/15135078.html
頁: [1]
查看完整版本: 易语言效率与C++究竟差多少(质数和计算)