小编Tim*_*ann的帖子

node.js如何比c和java更快?基准比较node.js,c,java和python

我做了一个非常简单的基准测试程序,用4种不同语言计算高达10,000,000的所有素数.

  • (2.97秒) - node.js(javascript)(4.4.5)
  • (6.96秒) - c(c99)
  • (6.91秒) - java(1.7)
  • (45.5秒) - 蟒蛇(2.7)

以上是每次平均3次运行,用户时间

Node.js运行速度最快.这让我很困惑,原因有两个:

  1. javascript总是对变量使用双精度浮点数,而c和java在这种情况下使用(长)整数.带整数的数学应该更快.
  2. 当javascript实际上是一种及时编译的语言时,javascript通常被称为解释.但即便如此,JIT编译器如何比完全编译的语言更快?python代码运行速度最慢,这并不奇怪,但为什么node.js代码的运行速度与python类似?

我用-O2优化编译了c代码,但我尝试了所有级别的优化,并没有产生显着的差异.

countPrime.js

"use strict";

var isPrime = function(n){
    //if (n !== parseInt(n,10)) {return false};
    if (n < 2) {return false};
    if (n === 2) {return true};
    if (n === 3) {return true};
    if (n % 2 === 0) {return false};
    if (n % 3 === 0) {return false};
    if (n % 1) {return false};
    var sqrtOfN = Math.sqrt(n);
    for (var i = 5; …
Run Code Online (Sandbox Code Playgroud)

c python java node.js

14
推荐指数
1
解决办法
3596
查看次数

使用 Beaglebone Black Angstrom 通过半双工 RS-485 分线板实现自动 RTS 的 Python PySerial

我正在尝试使用运行 Angstrom(3.8 内核)的 Beaglebone Black 与位于 9600-N-8-1 的半双工 RS-485 网络上的设备进行通信。

我正在尝试使用与此类似的 RS-485 分线板:https : //www.sparkfun.com/products/10124,但芯片是 MAX3485 http://www.maximintegrated.com/datasheet/index .mvp/id/1079。我购买了预先组装有引脚和端子条的电路板。我的一个朋友用示波器对其进行了测试,并声称 RS-485 板确实可以工作。该板有五个连接到 BBB 的引脚。3-5V(电源)、RX-I、TX-O、RTS 和 GND。

我在 BBB 上禁用了 HDMI 支持,以便UART4_RTSnUART4_CTSn引脚可用。

    mkdir /mnt/boot
    mount /dev/mmcblk0p1 /mnt/boot
    nano /mnt/boot/uEnv.txt
    #change contents of uEnv.txt to the following:
    optargs=quiet capemgr.disable_partno=BB-BONELT-HDMI,BB-BONELT-HDMIN 
Run Code Online (Sandbox Code Playgroud)

然后我找到了一个覆盖来启用带有 RTS/CTS 控制的 UART-4:

            /*
     * Modified version of /lib/firmware/BB-UART4-00A0.dtbo to add RTS so we can reset Arduinos
     */
    /dts-v1/;
    /plugin/;

    / {
      compatible = "ti,beaglebone", "ti,beaglebone-black";
      part-number = …
Run Code Online (Sandbox Code Playgroud)

python pyserial rs485 angstrom-linux beagleboneblack

6
推荐指数
1
解决办法
1万
查看次数

RS-485 串口波特率 性能效率

我正在使用 Python 开发一个应用程序,该应用程序通过 RS-485 两线、半双工与设备进行通信。我的应用程序已经足够运行,可以执行一些性能测试。我使用的是带有 USB 至 485 转换器的笔记本电脑。通讯设置为9600,N,8,1。

对于速度测试,我发送一条总长度为 10 个字节的消息,包括校验字节。然后我等待13个字节的回复。我在收到回复时对其进行解码。当回复完成时。然后我发送下一条消息。我尽可能快地重复这句话 100 次。这需要 2.895 秒。

据此,我计算出我正在发送/接收 23 字节 * 100 次迭代/2.895 秒 = 794 字节/秒。

如果我理解正确的话,9600 N-8-1的串口通信有1个起始位,8个数据位和1个停止位。这意味着它有 2 位开销。所以实际理论传输速率为(9600位/秒)*(8个数据位/10个传输位)*(1字节/8位)=960字节/秒。

我的程序以 794 字节/秒的组合速率发送/接收,而可能的 960 字节/秒 = 82.7%。

我应该能够实现接近 100% 的 960 字节/秒吗?或者说这么多的带宽没有被利用是很常见的吗?

python performance serial-port baud-rate

3
推荐指数
1
解决办法
2383
查看次数

c复制一个const结构数组

我有一个结构数组,一些结构成员是常量我想做一个数组的深层副本.该副本也将具有与常量相同的结构成员.如何在不违反const指令的情况下将值初始化为新数组.

下面是我的代码的摘录.实际的程序很长,但我想我已经包含了所有相关的代码.在这个例子中,被声明为一个全局变量,我想从中创建新的实例.我认为它有点像带预设值的模板.

当我尝试使用gcc在Debian中编译它时,我收到以下错误:

main.c:216:9: error: assignment of read-only location ‘*(new_keys + (unsigned int)((unsigned int)index * 540u))’make: *** [main.o] Error 1
Run Code Online (Sandbox Code Playgroud)

makefile使用以下限定符:

CFLAGS=-c -g -std=gnu99 -D_XOPEN_SOURCE=700
Run Code Online (Sandbox Code Playgroud)

有趣的是.即使为C语言方言GNU99设置了Xcode,我也可以在Xcode中编译相同的代码而不会出现错误或警告[-std = gnu99]

我可以简单地通过去除const关键字来使我的代码工作.但这些价值确实应该是常数.一旦这些数组初始化,它们将永远不会改变.我想了解如何正确地做到这一点,并且我想知道为什么这在Xcode而不是gcc中有效.

头文件

typedef struct {
    char * name;
    char * alias;
    int number;
} pair_int_t;

typedef struct {
    const char * const name;
    const kind_t kind; // kind is enum type
    const pair_int_t * const enum_array; 
    bool received; 
    const char * const alias; 
} key_descriptor_t;

typedef key_descriptor_t keys_descriptor_t[_END_OF_KEYS+1]; …
Run Code Online (Sandbox Code Playgroud)

c arrays struct copy const

3
推荐指数
1
解决办法
1672
查看次数

PM2可以与已编译的C程序一起使用吗

可以将pm2与自定义c程序一起使用吗?如果是这样,这是如何完成的?它运作良好吗?您是否已经将pm2用于node.js应用程序,也可以将其用于ac程序吗?

c pm2

3
推荐指数
2
解决办法
1851
查看次数

c snprintf用于连接字符串

我在两台不同的计算机上使用以下功能.一台计算机运行Ubuntu,另一台运行OS X.该功能适用​​于OS X,但不适用于Ubuntu.

#include <stdio.h>

#define MAXBUF 256

char *safe_strncat(char *dest, const char *src, size_t n) {
    snprintf(dest, n, "%s%s", dest, src);
    return dest;
}

int main(int argc, const char * argv[]){
    char st1[MAXBUF+1] = "abc";
    char st2[MAXBUF+1] = "def";
    char* st3;
    printf("%s + %s = ",st1, st2);

    st3 = safe_strncat(st1, st2, MAXBUF);

    printf("%s\n",st3);
    printf("original string = %s\n",st1);
}
Run Code Online (Sandbox Code Playgroud)

编译并在Ubuntu上运行

gcc concat_test.c -o concat_test

./concat_test

abc + def = def

原始字符串= def

在OS X中编译并运行Xcode

abc + def = abcdef

原始字符串= …

c linux string

1
推荐指数
1
解决办法
471
查看次数