测试逻辑:
循环10万次输出打印hello world
测试平台:windows
测试结果
语言 | 占用内存 | 包大小 | 耗时 |
---|---|---|---|
go | 5324k | 可执行文件:2172k | 平均8502毫秒 |
java | 175326k | 字节码文件:2k | 平均8537毫秒 |
dotnetcore | 3612k | 打包发布:65.4m | 平均8371毫秒 |
截图介绍
- go: 直接运行main.exe
代码:
package main import ( "fmt" "os" "os/signal" "syscall" "time" ) func main() { t1 := time.Now() // get current time //logic handlers for i := 0; i < 100000; i++ { fmt.Println("hello world") } elapsed := time.Since(t1) fmt.Println("App elapsed: ", elapsed) sig := make(chan os.Signal, 2) signal.Notify(sig, syscall.SIGTERM, syscall.SIGINT) <-sig }
发布后的目录
- java: 运行编译后的字节码文件 java HelloWorld
代码
import java.io.IOException; public class HelloWorld { public static void main(final String[] args) throws IOException { final long time1 = System.currentTimeMillis(); int i = 0; for (; i < 100000; i++) { System.out.println("hello world"); } final long time2 = System.currentTimeMillis(); System.out.println("当前程序耗时:" + (time2 - time1) + "ms"); System.in.read(); } }
编译后的目录
- dotnetcore: 直接运行netcore_prj.exe
代码
using System; using System.Diagnostics; using System.Threading.Tasks; using System.Threading; namespace netcore_prj { class Program { static async Task Main(string[] args) { var watch = new Stopwatch(); watch.Start(); for (var i = 0; i < 100000; i++) Console.WriteLine("hello world"); watch.Stop(); Console.WriteLine($"循环100000次Say Hello World,用时:{watch.ElapsedMilliseconds}ms"); Console.ReadLine(); } } }
发布后的目录
测试平台:linux centos7 (10.0.1.7)
测试结果
语言 | 虚拟内存 | 物理内存 | 包大小 | 耗时 |
---|---|---|---|---|
go | 100M | 976 | 2104k | 平均170ms |
java | 4647M | 33660 | 4k | 平均335ms |
dotnetcore | 2712M | 18988 | 110m | 平均144ms |
打包到以下的测试目录:
-
go: 直接运行 nohup ./go_main &
-
java: 运行编译后的字节码文件 nohup java HelloWorld &
-
dotnetcore: 进入netcore目录运行 nohup ./netcore_prj &
-
PID:进行的标识号
- USER:运行此进程的用户
- PRI:进程的优先级
- NI:进程的优先级别值,默认的为0,可以进行调整
- VIRT:进程占用的虚拟内存值
- RES:进程占用的物理内存值
- SHR:进程占用的共享内存值
- S:进程的运行状况,R表示正在运行、S表示休眠,等待唤醒、Z表示僵死状态
- %CPU:该进程占用的CPU使用率
- %MEM:该进程占用的物理内存和总内存的百分比
- TIME+:该进程启动后占用的总的CPU时间
- COMMAND:进程启动的启动命令名称