Node.js与java性能测试 (http与redis访问)(贴出测试用例,代码以及测试结果)

Node.js与java性能测试 (http与redis访问)(贴出测试用例,代码以及测试结果)

http://blog.csdn.net/fjslovejhl/article/details/13298047

只是个人觉得以前的各种测试都不是太合理。。。要么比较偏袒java,要么比较偏袒node.js 另外对测试用例以及测试的代码如果有什么不对的地方,还请大家指正出来。。。。

9 回复

为了进行Node.js与Java在HTTP请求及Redis访问上的性能对比,我们将通过编写测试用例、执行代码,并展示测试结果来完成。以下是基于这些需求的一个简单示例。

Node.js 示例

首先,我们需要安装一些必要的依赖包,例如express用于创建Web服务器,ioredis用于与Redis交互。

npm install express ioredis

测试用例代码 (Node.js)

// app.js (Node.js)
const express = require('express');
const Redis = require('ioredis');

const app = express();
const redis = new Redis();

app.get('/', async (req, res) => {
    try {
        // 访问Redis
        const data = await redis.get('testKey');
        res.send(`Hello World! Redis Data: ${data}`);
    } catch (error) {
        res.status(500).send(error.message);
    }
});

app.listen(3000, () => console.log('Server running on port 3000'));

性能测试工具 (Apache Bench)

使用Apache Bench (ab) 来模拟并发用户请求:

ab -c 100 -n 1000 http://localhost:3000/

Java 示例

对于Java部分,我们可以使用Spring Boot框架来简化开发。

测试用例代码 (Java)

// Application.java (Spring Boot)
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.redis.core.StringRedisTemplate;

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @RestController
    public class HelloController {

        private final StringRedisTemplate template;

        public HelloController(StringRedisTemplate template) {
            this.template = template;
        }

        @GetMapping("/")
        public String index() {
            return "Hello World! Redis Data: " + template.opsForValue().get("testKey");
        }
    }
}

构建并运行Spring Boot应用

mvn spring-boot:run

测试结果

假设我们分别运行了上述Node.js和Java应用,并使用相同的测试工具(如Apache Bench)进行了性能测试。下面是可能得到的结果:

  • Node.js: 并发100个连接下,每秒处理约2000个请求。
  • Java: 同样条件下,每秒处理约1500个请求。

结论

以上示例展示了如何设置基准测试以比较Node.js和Java在HTTP请求及Redis访问方面的性能。实际结果可能会根据硬件配置、网络状况等因素有所不同。在实际部署时,建议进行更全面的测试,并考虑生产环境的具体情况。

请注意,这里提供的代码仅为演示目的,实际应用中可能需要更多的错误处理和优化措施。


还算比较客观了。。 还是只能说,每个语言有自己的好坏。。 还是要看个人洗好和应用场景

50 并发? 为啥不搞大一些?

话说,java 的服务端的性能其实不差啊…

Node.js 更多的比较对象是PHP…

如果压测不压到极限的话,很难看出两者的差异,楼主可以试一下用四台压一台。

ab 这种东西还是内网测试比较好,从中国往美国东部这跨度太广,带宽和响应速度都跟不上。内网响应低带宽大,很容易看出差距。而且也不会有被IDC封掉的危险。

亲,nodejs的redis client你装了hiredis模块了么?

Pieter Noordhuis has provided a binding to the official hiredis C library, which is non-blocking and fast. To use hiredis, do: npm install hiredis redis

https://github.com/mranney/node_redis#redis—a-nodejs-redis-client

其实做这样子的测试没啥太大的压力,说来说去到最后,不管是c语言,node.js,还是java到最后都是一些I/O多路复用的东西,本质上都是一样的。。。以前开发东西的时候,也做过类似的测试,用libevent和C语言与node.js做了对比,跑满内网路由器的情况下,c语言实现的版本cpu和内存都要好的多,这次做的测试,同样java的也比node.js在CPU方面好得多。。那么在底层I/O大家都本质上没有太大的区别的情况下单纯的比较性能就能够推理出谁更好了。。。 其实感觉更关注每种语言与技术适合的范围可能意义更大一些。。。。之前自己采用node.js来开发而不是采用C+libevent的版本就是因为觉得node.js的开发更快,而且相对C,更有把握。。。

在这个帖子中,你需要对比Node.js和Java在HTTP请求和Redis访问上的性能。以下是一种可能的方法来实现这一目标,包括测试用例、代码示例和预期的测试结果。

测试环境

确保你有一个可以访问的HTTP服务器和Redis实例。这里我们假设HTTP服务器监听在 localhost:3000,Redis实例运行在 localhost:6379

Node.js 示例代码

HTTP 请求

const http = require('http');
const redis = require('redis');

const client = redis.createClient();

function makeRequest() {
    return new Promise((resolve, reject) => {
        http.get('http://localhost:3000', (res) => {
            let data = '';
            res.on('data', (chunk) => { data += chunk; });
            res.on('end', () => resolve(data));
        }).on('error', (err) => reject(err));
    });
}

async function testHttp() {
    const iterations = 100;
    const startTime = Date.now();
    for (let i = 0; i < iterations; i++) {
        await makeRequest();
    }
    const endTime = Date.now();
    console.log(`Node.js HTTP Request Performance: ${iterations} requests in ${endTime - startTime} ms`);
}

Redis 访问

async function testRedis() {
    const iterations = 100;
    const startTime = Date.now();
    for (let i = 0; i < iterations; i++) {
        await new Promise((resolve, reject) => {
            client.set(i.toString(), 'test', (err, reply) => {
                if (err) reject(err);
                resolve(reply);
            });
        });
    }
    const endTime = Date.now();
    console.log(`Node.js Redis Performance: ${iterations} set operations in ${endTime - startTime} ms`);
}

Java 示例代码

HTTP 请求

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class HttpClient {
    public static void main(String[] args) throws Exception {
        long start = System.currentTimeMillis();
        for (int i = 0; i < 100; i++) {
            makeRequest();
        }
        long end = System.currentTimeMillis();
        System.out.println("Java HTTP Request Performance: " + (end - start) + " ms");
    }

    private static void makeRequest() throws Exception {
        URL url = new URL("http://localhost:3000");
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
        while (reader.readLine() != null);
        reader.close();
    }
}

Redis 访问

import redis.clients.jedis.Jedis;

public class RedisClient {
    public static void main(String[] args) {
        Jedis jedis = new Jedis("localhost");
        long start = System.currentTimeMillis();
        for (int i = 0; i < 100; i++) {
            jedis.set(Integer.toString(i), "test");
        }
        long end = System.currentTimeMillis();
        System.out.println("Java Redis Performance: " + (end - start) + " ms");
        jedis.close();
    }
}

测试结果

在运行上述代码后,你会得到每个框架处理HTTP请求和Redis操作的时间。将这些时间记录下来进行比较。

结论

通过对比Node.js和Java在HTTP请求和Redis访问上的性能,你可以得出结论哪个框架更适合你的应用场景。记得多次运行测试以获得更准确的结果,并考虑网络延迟和其他外部因素的影响。

回到顶部