【问题标题】:Get vs Post Performance获取与发布性能
【发布时间】:2014-11-14 05:07:17
【问题描述】:

我正在构建一个 REST 服务,我期待很多请求(甚至是 DoS 攻击)。那么考虑一下网络和 CPU 消耗,哪种 HTTP 方法更适合我的服务器(接受 POST 或 GET)?

我已经做了一些测试...使用虚拟机 Ubuntu 14.04 (1 core) 作为服务器,带有 apache 和 php

get.php:

$s = "G: ";
foreach ( $_GET as $key => $val){
    $s .= $val . ", ";
}
echo $s;

post.php:

$s = "P: ";
foreach ( $_POST as $key => $val){
    $s .= $val . ", ";
}
echo $s;

测试#1(使用 ab):

ab -n 10000 'http://10.0.0.112/get.php?key1=val1&key2=val2&key3=val3'
Concurrency Level:      1
Time taken for tests:   9.080 seconds
Complete requests:      10000
Failed requests:        0
Total transferred:      2080000 bytes
HTML transferred:       210000 bytes
Requests per second:    1101.33 [#/sec] (mean)
Time per request:       0.908 [ms] (mean)
Time per request:       0.908 [ms] (mean, across all concurrent requests)
Transfer rate:          223.71 [Kbytes/sec] received

ab -n 10000 -p post.data -T application/x-www-form-urlencoded 'http://10.0.0.112/post.php'
Concurrency Level:      1
Time taken for tests:   9.526 seconds
Complete requests:      10000
Failed requests:        0
Total transferred:      2090000 bytes
Total body sent:        1860000
HTML transferred:       220000 bytes
Requests per second:    1049.72 [#/sec] (mean)
Time per request:       0.953 [ms] (mean)
Time per request:       0.953 [ms] (mean, across all concurrent requests)
Transfer rate:          214.25 [Kbytes/sec] received

我多次运行 AB 测试,结果相同:POST 更快,但 GET 更轻。所以我想在第二次测试中(更真实的)。

测试#2(使用 wget):

TIME_POST=0
TIME_GET=0
X1=100
X2=10

function fpost {
        START=$(date +%s.%N)
        i=0
        while [ $i -lt $X1 ]
        do
                wget -q -O out.file 'http://10.0.0.112/post.php' --post-data 'key1=val1&key2=val2&key3=val3'
                rm -rf out.file
                i=$[$i+1]
        done
        END=$(date +%s.%N)
        T=$(echo "$END - $START" | bc)
        echo "POST: $T"
        TIME_POST=$(echo "$TIME_POST + $T" | bc)
}

function fget {
        START=$(date +%s.%N)
        i=0
        while [ $i -lt $X1 ]
        do
                wget -q -O out.file 'http://10.0.0.112/get.php?key1=val1&key2=val2&key3=val3'
                rm -rf out.file
                i=$[$i+1]
        done
        END=$(date +%s.%N)
        T=$(echo "$END - $START" | bc)
        echo "GET:  $T"
        TIME_GET=$(echo "$TIME_GET + $T" | bc)
}

j=0
while [ $j -lt $X2 ]
do
        echo "#"$[$j+1]
        fpost
        fget
        echo
        j=$[$j+1]
done
echo "TIME POST: $TIME_POST"
echo "TIME GET: $TIME_GET"

mmmmm 与 wget 测试.... GET 更快:

...
TIME POST: 54.707362313
TIME GET: 53.049255400

哪种 HTTP 方法的性能更好?

我应该关心它吗?

我应该期待 nginx 或 nodejs (expess) 的不同结果吗?

【问题讨论】:

  • 到目前为止的答案都很好,但你的问题是关于速度的。您可能比这里的其他任何东西都更能测试abwget 的速度; POST 和 GET 在速度上不应有任何固有的显着差异。

标签: rest post get


【解决方案1】:

在处理 api 时,我认为现在大多数开发人员都习惯于使用 RESTful 接口。所以这不是什么更快的问题,而是请求的目的是什么。所以当你说你正在构建一个 RESTful api 时,有一些规则可以取代你所问的问题。也就是说,速度问题无关紧要。

http://en.wikipedia.org/wiki/Representational_state_transfer

就您发布的结果而言,GET 移动的数据更少,并且应该总是更快一些。

【讨论】:

    【解决方案2】:

    就像生活中的几乎所有事情一样,这取决于。

    通常我不会说性能受方法的影响很大,而是受 I/O 影响,这意味着首先改进最慢的部分会更容易,通常是输入/输出操作(数据库、文件。 ..) 通常添加缓存层并检查您的查询将提高您的 api 的性能。

    此外,从“纯粹”的角度来看,GET ~ Read and POST ~ write(更不用说 PUT 和 DELETE)了。

    最后考虑通过 GET 完成对您的 API 的某些请求会有点复杂(例如,假设您希望员工姓名以 J 开头、年龄超过 35 岁且工资介于 30 到45k EUR...),在那种情况下,即使是读取操作,POST 也可能(只是可能)更方便。

    总而言之,不要太担心 GET 和 POST 之间的性能差异,而要多担心内部问题。

    呃!最后一条建议,保持 API 无状态。

    【讨论】:

      【解决方案3】:

      GET 可能会稍微快一点

      引用treehouse blog

      使用 XMLHttpRequest 时,浏览器将 POST 实现为两步 进程(先发送标头,然后发送数据)。

      【讨论】:

      • 我不同意:1)它不会慢很多...... 2)我不知道什么是2个HTTP调用..但它会是2个网络数据包。 3) Firefox 仍然只会发送 1 个数据包.. 4) 有些人声称 Chrome 53 已经发送了 1 个数据包。
      • 同意。已更正。
      猜你喜欢
      • 2011-05-05
      • 1970-01-01
      • 2011-01-27
      • 1970-01-01
      • 2013-10-25
      • 1970-01-01
      • 1970-01-01
      • 2019-11-25
      • 2019-02-11
      相关资源
      最近更新 更多