github.com/DARA-Project/GoDist-Scheduler@v0.0.0-20201030134746-668de4acea0d/u-benchmarks/go_vs_dgo/sys_test.go (about) 1 package main 2 3 import ( 4 "log" 5 "net" 6 "os" 7 "testing" 8 "time" 9 ) 10 11 const textFile = "hello_world.txt" 12 const ipport = "127.0.0.1:12345" 13 14 func BenchmarkFileOpen(b *testing.B) { 15 f := CreateOrDie(textFile) 16 f.Close() 17 b.ResetTimer() 18 for i := 0; i < b.N; i++ { 19 os.Open(textFile) 20 } 21 b.StopTimer() 22 RemoveOrDie(textFile) 23 24 } 25 26 func BenchmarkFileRead(b *testing.B) { 27 f := CreateOrDie(textFile) 28 f.Write([]byte("Hello World\n")) 29 f.Close() 30 f = OpenOrDie(textFile) 31 b1 := make([]byte, 20) 32 b.ResetTimer() 33 for i := 0; i < b.N; i++ { 34 b.StartTimer() 35 f.Read(b1) 36 b.StopTimer() 37 f.Seek(0, 0) // seek to beginning of file 38 } 39 f.Close() 40 RemoveOrDie(textFile) 41 } 42 43 func BenchmarkFileClose(b *testing.B) { 44 f := CreateOrDie(textFile) 45 b.ResetTimer() 46 for i := 0; i < b.N; i++ { 47 f.Close() 48 b.StopTimer() 49 f = OpenOrDie(textFile) 50 b.StartTimer() 51 } 52 RemoveOrDie(textFile) 53 } 54 55 func BenchmarkFileWrite_NoRemove(b *testing.B) { 56 f := CreateOrDie(textFile) 57 b.ResetTimer() 58 for i := 0; i < b.N; i++ { 59 f.Write([]byte("Hello World\n")) 60 } 61 b.StopTimer() 62 f.Close() 63 RemoveOrDie(textFile) 64 } 65 66 func BenchmarkFileWrite_RemovePerIter(b *testing.B) { 67 f := CreateOrDie(textFile) 68 b.ResetTimer() 69 for i := 0; i < b.N; i++ { 70 b.StartTimer() 71 f.Write([]byte("Hello World\n")) 72 b.StopTimer() 73 f.Close() 74 RemoveOrDie(textFile) 75 f = CreateOrDie(textFile) 76 } 77 RemoveOrDie(textFile) 78 } 79 80 func BenchmarkFileFstat(b *testing.B) { 81 f := CreateOrDie(textFile) 82 b.ResetTimer() 83 for i := 0; i < b.N; i++ { 84 f.Stat() 85 } 86 b.StopTimer() 87 f.Close() 88 RemoveOrDie(textFile) 89 } 90 91 func BenchmarkFileStat(b *testing.B) { 92 f := CreateOrDie(textFile) 93 f.Close() 94 b.ResetTimer() 95 for i := 0; i < b.N; i++ { 96 os.Stat(textFile) 97 } 98 b.StopTimer() 99 RemoveOrDie(textFile) 100 } 101 102 func BenchmarkFileLstat(b *testing.B) { 103 f := CreateOrDie(textFile) 104 f.Close() 105 b.ResetTimer() 106 for i := 0; i < b.N; i++ { 107 os.Lstat(textFile) 108 } 109 b.StopTimer() 110 RemoveOrDie(textFile) 111 } 112 113 func BenchmarkFileLseek(b *testing.B) { 114 offset := int64(5) 115 whence := 0 // offset relative to file origin 116 f := CreateOrDie(textFile) 117 f.Write([]byte("Hello World\n")) 118 b.ResetTimer() 119 for i := 0; i < b.N; i++ { 120 f.Seek(offset, whence) 121 } 122 b.StopTimer() 123 f.Close() 124 RemoveOrDie(textFile) 125 } 126 127 func BenchmarkFilePread64(b *testing.B) { 128 offset := int64(0) 129 f := CreateOrDie(textFile) 130 f.Write([]byte("Hello World\n")) 131 f.Close() 132 f = OpenOrDie(textFile) 133 buf := make([]byte, 20) 134 b.ResetTimer() 135 for i := 0; i < b.N; i++ { 136 f.ReadAt(buf, offset) 137 } 138 b.StopTimer() 139 RemoveOrDie(textFile) 140 } 141 142 func BenchmarkFilePwrite64(b *testing.B) { 143 offset := int64(5) 144 f := CreateOrDie(textFile) 145 b.ResetTimer() 146 for i := 0; i < b.N; i++ { 147 f.WriteAt([]byte("hello_world\n"), offset) 148 } 149 b.StopTimer() 150 f.Close() 151 RemoveOrDie(textFile) 152 } 153 154 func BenchmarkGetpagesize(b *testing.B) { 155 for i := 0; i < b.N; i++ { 156 os.Getpagesize() 157 } 158 } 159 160 func BenchmarkExecutable(b *testing.B) { 161 for i := 0; i < b.N; i++ { 162 os.Executable() 163 } 164 } 165 166 func BenchmarkGetpid(b *testing.B) { 167 for i := 0; i < b.N; i++ { 168 os.Getpid() 169 } 170 } 171 172 func BenchmarkGetppid(b *testing.B) { 173 for i := 0; i < b.N; i++ { 174 os.Getppid() 175 } 176 } 177 178 func BenchmarkGetwd(b *testing.B) { 179 for i := 0; i < b.N; i++ { 180 os.Getwd() 181 } 182 } 183 184 func BenchmarkReaddir(b *testing.B) { 185 MkdirOrDie("temp") 186 CreateOrDie("temp/hello_world.txt") 187 f := OpenOrDie("temp") 188 b.ResetTimer() 189 for i := 0; i < b.N; i++ { 190 b.StartTimer() 191 f.Readdir(0) // read all files in directory 192 b.StopTimer() 193 f.Seek(0, 0) // seek to beginning of directory 194 } 195 RemoveOrDie("temp") 196 } 197 198 func BenchmarkReaddirnames(b *testing.B) { 199 MkdirOrDie("temp") 200 CreateOrDie("temp/hello_world.txt") 201 f := OpenOrDie("temp") 202 b.ResetTimer() 203 for i := 0; i < b.N; i++ { 204 b.StartTimer() 205 f.Readdirnames(0) // read all files in directory 206 b.StopTimer() 207 f.Seek(0, 0) // seek to beginning of directory 208 } 209 RemoveOrDie("temp") 210 } 211 212 func BenchmarkWait4(b *testing.B) { 213 // Parameters to start a new process that sleeps forever, 214 // so we can reliably kill it. 215 argc := "/bin/sleep" 216 argv := []string{"infinity"} 217 attr := &os.ProcAttr{ 218 Dir: "", 219 Files: nil, 220 Env: nil, 221 Sys: nil, 222 } 223 b.ResetTimer() 224 b.StopTimer() 225 for i := 0; i < b.N; i++ { 226 proc, err := os.StartProcess(argc, argv, attr) 227 if err != nil { 228 log.Fatal(err) 229 } 230 err = proc.Kill() 231 if err != nil { 232 log.Fatal(err) 233 } 234 b.StartTimer() 235 proc.Wait() 236 b.StopTimer() 237 } 238 } 239 240 func BenchmarkKill(b *testing.B) { 241 // Parameters to start a new process that sleeps forever, 242 // so we can reliably kill it. 243 argc := "/bin/sleep" 244 argv := []string{"infinity"} 245 attr := &os.ProcAttr{ 246 Dir: "", 247 Files: nil, 248 Env: nil, 249 Sys: nil, 250 } 251 b.ResetTimer() 252 b.StopTimer() 253 for i := 0; i < b.N; i++ { 254 proc, err := os.StartProcess(argc, argv, attr) 255 if err != nil { 256 log.Fatal(err) 257 } 258 b.StartTimer() 259 proc.Kill() 260 b.StopTimer() 261 // Wait for process to terminate so we don't use up 262 // the allotted number of user processes. 263 proc.Wait() 264 } 265 } 266 267 func BenchmarkGetuid(b *testing.B) { 268 for i := 0; i < b.N; i++ { 269 os.Getuid() 270 } 271 } 272 273 func BenchmarkGeteuid(b *testing.B) { 274 for i := 0; i < b.N; i++ { 275 os.Geteuid() 276 } 277 } 278 279 func BenchmarkGetgid(b *testing.B) { 280 for i := 0; i < b.N; i++ { 281 os.Getgid() 282 } 283 } 284 285 func BenchmarkGetegid(b *testing.B) { 286 for i := 0; i < b.N; i++ { 287 os.Getegid() 288 } 289 } 290 291 func BenchmarkGetgroups(b *testing.B) { 292 for i := 0; i < b.N; i++ { 293 os.Getgroups() 294 } 295 } 296 297 func BenchmarkRename(b *testing.B) { 298 f := CreateOrDie(textFile) 299 f.Close() 300 b.ResetTimer() 301 for i := 0; i < b.N; i++ { 302 os.Rename(textFile, textFile) 303 } 304 b.StopTimer() 305 RemoveOrDie(textFile) 306 } 307 308 func BenchmarkTruncate(b *testing.B) { 309 f := CreateOrDie(textFile) 310 f.Close() 311 b.ResetTimer() 312 for i := 0; i < b.N; i++ { 313 // Truncate file to some arbitrary size. 314 os.Truncate(textFile, 12) 315 } 316 b.StopTimer() 317 RemoveOrDie(textFile) 318 } 319 320 func BenchmarkLink(b *testing.B) { 321 f := CreateOrDie(textFile) 322 f.Close() 323 b.ResetTimer() 324 for i := 0; i < b.N; i++ { 325 b.StartTimer() 326 os.Link(textFile, "new.txt") 327 b.StopTimer() 328 RemoveOrDie("new.txt") 329 } 330 RemoveOrDie(textFile) 331 } 332 333 func BenchmarkSymlink(b *testing.B) { 334 f := CreateOrDie(textFile) 335 f.Close() 336 b.ResetTimer() 337 for i := 0; i < b.N; i++ { 338 b.StartTimer() 339 os.Symlink(textFile, "new.txt") 340 b.StopTimer() 341 RemoveOrDie("new.txt") 342 } 343 RemoveOrDie(textFile) 344 } 345 346 func BenchmarkPipe2(b *testing.B) { 347 for i := 0; i < b.N; i++ { 348 b.StartTimer() 349 r, w, err := os.Pipe() 350 b.StopTimer() 351 if err != nil { 352 log.Fatal(err) 353 } 354 r.Close() 355 w.Close() 356 } 357 } 358 359 func BenchmarkMkdir(b *testing.B) { 360 for i := 0; i < b.N; i++ { 361 b.StartTimer() 362 os.Mkdir("temp", os.ModePerm) 363 b.StopTimer() 364 RemoveOrDie("temp") 365 } 366 } 367 368 func BenchmarkChdir(b *testing.B) { 369 for i := 0; i < b.N; i++ { 370 os.Chdir(".") 371 } 372 } 373 374 func BenchmarkUnsetenv(b *testing.B) { 375 b.StopTimer() 376 for i := 0; i < b.N; i++ { 377 err := os.Setenv("new_key", "new_value") 378 if err != nil { 379 log.Fatal(err) 380 } 381 b.StartTimer() 382 os.Unsetenv("new_key") 383 b.StopTimer() 384 } 385 } 386 387 func BenchmarkGetenv(b *testing.B) { 388 err := os.Setenv("new_key", "new_value") 389 if err != nil { 390 log.Fatal(err) 391 } 392 b.ResetTimer() 393 for i := 0; i < b.N; i++ { 394 os.Getenv("new_key") 395 } 396 b.StopTimer() 397 err = os.Unsetenv("new_key") 398 if err != nil { 399 log.Fatal(err) 400 } 401 } 402 403 func BenchmarkSetenv(b *testing.B) { 404 for i := 0; i < b.N; i++ { 405 b.StartTimer() 406 os.Setenv("new_key", "new_value") 407 b.StopTimer() 408 err := os.Unsetenv("new_key") 409 if err != nil { 410 log.Fatal(err) 411 } 412 } 413 } 414 415 func BenchmarkClearenv(b *testing.B) { 416 for i := 0; i < b.N; i++ { 417 os.Clearenv() 418 } 419 } 420 421 func BenchmarkEnviron(b *testing.B) { 422 for i := 0; i < b.N; i++ { 423 os.Environ() 424 } 425 } 426 427 func BenchmarkTimenow(b *testing.B) { 428 for i := 0; i < b.N; i++ { 429 time.Now() 430 } 431 } 432 433 func BenchmarkReadlink(b *testing.B) { 434 f := CreateOrDie(textFile) 435 f.Close() 436 err := os.Symlink(textFile, "link.txt") 437 if err != nil { 438 log.Fatal(err) 439 } 440 b.ResetTimer() 441 for i := 0; i < b.N; i++ { 442 os.Readlink("link.txt") 443 } 444 b.StopTimer() 445 RemoveOrDie("link.txt") 446 RemoveOrDie(textFile) 447 } 448 449 func BenchmarkChmod(b *testing.B) { 450 f := CreateOrDie(textFile) 451 f.Close() 452 b.ResetTimer() 453 for i := 0; i < b.N; i++ { 454 os.Chmod(textFile, os.ModePerm) 455 } 456 b.StopTimer() 457 RemoveOrDie(textFile) 458 } 459 460 func BenchmarkFchmod(b *testing.B) { 461 f := CreateOrDie(textFile) 462 b.ResetTimer() 463 for i := 0; i < b.N; i++ { 464 f.Chmod(os.ModePerm) 465 } 466 b.StopTimer() 467 f.Close() 468 RemoveOrDie(textFile) 469 } 470 471 func BenchmarkChown(b *testing.B) { 472 uid := os.Getuid() 473 gid := os.Getgid() 474 f := CreateOrDie(textFile) 475 f.Close() 476 b.ResetTimer() 477 for i := 0; i < b.N; i++ { 478 os.Chown(textFile, uid, gid) 479 } 480 b.StopTimer() 481 RemoveOrDie(textFile) 482 } 483 484 func BenchmarkLchown(b *testing.B) { 485 uid := os.Getuid() 486 gid := os.Getgid() 487 f := CreateOrDie(textFile) 488 f.Close() 489 b.ResetTimer() 490 for i := 0; i < b.N; i++ { 491 os.Lchown(textFile, uid, gid) 492 } 493 b.StopTimer() 494 RemoveOrDie(textFile) 495 } 496 497 func BenchmarkFchown(b *testing.B) { 498 uid := os.Getuid() 499 gid := os.Getgid() 500 f := CreateOrDie(textFile) 501 b.ResetTimer() 502 for i := 0; i < b.N; i++ { 503 f.Chown(uid, gid) 504 } 505 b.StopTimer() 506 f.Close() 507 RemoveOrDie(textFile) 508 } 509 510 func BenchmarkFtruncate(b *testing.B) { 511 f := CreateOrDie(textFile) 512 b.ResetTimer() 513 for i := 0; i < b.N; i++ { 514 f.Truncate(10) 515 } 516 b.StopTimer() 517 f.Close() 518 RemoveOrDie(textFile) 519 } 520 521 func BenchmarkFsync(b *testing.B) { 522 f := CreateOrDie(textFile) 523 b.ResetTimer() 524 for i := 0; i < b.N; i++ { 525 f.Sync() 526 } 527 b.StopTimer() 528 f.Close() 529 RemoveOrDie(textFile) 530 } 531 532 func BenchmarkUtimes(b *testing.B) { 533 now := time.Now() 534 f := CreateOrDie(textFile) 535 f.Close() 536 b.ResetTimer() 537 for i := 0; i < b.N; i++ { 538 os.Chtimes(textFile, now, now) 539 } 540 b.StopTimer() 541 RemoveOrDie(textFile) 542 } 543 544 func BenchmarkFchdir(b *testing.B) { 545 f := CreateOrDie(textFile) 546 b.ResetTimer() 547 for i := 0; i < b.N; i++ { 548 f.Chdir() 549 } 550 b.StopTimer() 551 RemoveOrDie(textFile) 552 } 553 554 func BenchmarkSetDeadline(b *testing.B) { 555 now := time.Now() 556 r, w, err := os.Pipe() 557 if err != nil { 558 log.Fatal(err) 559 } 560 b.ResetTimer() 561 for i := 0; i < b.N; i++ { 562 r.SetDeadline(now) 563 } 564 b.StopTimer() 565 r.Close() 566 w.Close() 567 } 568 569 func BenchmarkSetReadDeadline(b *testing.B) { 570 now := time.Now() 571 r, w, err := os.Pipe() 572 if err != nil { 573 log.Fatal(err) 574 } 575 b.ResetTimer() 576 for i := 0; i < b.N; i++ { 577 r.SetReadDeadline(now) 578 } 579 b.StopTimer() 580 r.Close() 581 w.Close() 582 } 583 584 func BenchmarkSetWriteDeadline(b *testing.B) { 585 now := time.Now() 586 r, w, err := os.Pipe() 587 if err != nil { 588 log.Fatal(err) 589 } 590 b.ResetTimer() 591 for i := 0; i < b.N; i++ { 592 w.SetWriteDeadline(now) 593 } 594 b.StopTimer() 595 r.Close() 596 w.Close() 597 } 598 599 func BenchmarkNetRead(b *testing.B) { 600 serverConn, clientConn := GenerateTCPConnPair() 601 buf := make([]byte, 20) 602 b.ResetTimer() 603 b.StopTimer() 604 for i := 0; i < b.N; i++ { 605 serverConn.Write([]byte("hello world\n")) 606 b.StartTimer() 607 clientConn.Read(buf) 608 b.StopTimer() 609 } 610 serverConn.Close() 611 clientConn.Close() 612 } 613 614 func BenchmarkNetWrite(b *testing.B) { 615 serverConn, clientConn := GenerateTCPConnPair() 616 buf := make([]byte, 20) 617 b.ResetTimer() 618 for i := 0; i < b.N; i++ { 619 b.StartTimer() 620 clientConn.Write([]byte("hello world\n")) 621 b.StopTimer() 622 serverConn.Read(buf) 623 } 624 serverConn.Close() 625 clientConn.Close() 626 } 627 628 func BenchmarkNetClose(b *testing.B) { 629 b.StopTimer() 630 for i := 0; i < b.N; i++ { 631 serverConn, clientConn := GenerateTCPConnPair() 632 b.StartTimer() 633 clientConn.Close() 634 b.StopTimer() 635 serverConn.Close() 636 } 637 } 638 639 func BenchmarkNetSetDeadline(b *testing.B) { 640 t := time.Now() 641 serverConn, clientConn := GenerateTCPConnPair() 642 b.ResetTimer() 643 for i := 0; i < b.N; i++ { 644 clientConn.SetDeadline(t) 645 } 646 b.StopTimer() 647 serverConn.Close() 648 clientConn.Close() 649 } 650 651 func BenchmarkNetSetReadDeadline(b *testing.B) { 652 t := time.Now() 653 serverConn, clientConn := GenerateTCPConnPair() 654 b.ResetTimer() 655 for i := 0; i < b.N; i++ { 656 clientConn.SetReadDeadline(t) 657 } 658 b.StopTimer() 659 serverConn.Close() 660 clientConn.Close() 661 } 662 663 func BenchmarkNetSetWriteDeadline(b *testing.B) { 664 t := time.Now() 665 serverConn, clientConn := GenerateTCPConnPair() 666 b.ResetTimer() 667 for i := 0; i < b.N; i++ { 668 clientConn.SetWriteDeadline(t) 669 } 670 b.StopTimer() 671 serverConn.Close() 672 clientConn.Close() 673 } 674 675 func BenchmarkNetSetReadBuffer(b *testing.B) { 676 serverConn, clientConn := GenerateTCPConnPair() 677 b.ResetTimer() 678 for i := 0; i < b.N; i++ { 679 clientConn.SetReadBuffer(100) 680 } 681 b.StopTimer() 682 serverConn.Close() 683 clientConn.Close() 684 } 685 686 func BenchmarkNetSetWriteBuffer(b *testing.B) { 687 serverConn, clientConn := GenerateTCPConnPair() 688 b.ResetTimer() 689 for i := 0; i < b.N; i++ { 690 clientConn.SetWriteBuffer(100) 691 } 692 b.StopTimer() 693 serverConn.Close() 694 clientConn.Close() 695 } 696 697 func BenchmarkSocket(b *testing.B) { 698 addr, err := net.ResolveTCPAddr("tcp", ipport) 699 if err != nil { 700 log.Fatal(err) 701 } 702 listener, err := net.ListenTCP("tcp", addr) 703 if err != nil { 704 log.Fatal(err) 705 } 706 b.ResetTimer() 707 for i := 0; i < b.N; i++ { 708 b.StartTimer() 709 clientConn, err := net.DialTCP("tcp", nil, addr) 710 b.StopTimer() 711 if err != nil { 712 log.Fatal(err) 713 } 714 serverConn, err := listener.AcceptTCP() 715 if err != nil { 716 log.Fatal(err) 717 } 718 serverConn.Close() 719 clientConn.Close() 720 } 721 listener.Close() 722 } 723 724 func BenchmarkListenTCP(b *testing.B) { 725 addr, err := net.ResolveTCPAddr("tcp", ipport) 726 if err != nil { 727 log.Fatal(err) 728 } 729 b.ResetTimer() 730 for i := 0; i < b.N; i++ { 731 b.StartTimer() 732 listener, err := net.ListenTCP("tcp", addr) 733 b.StopTimer() 734 if err != nil { 735 log.Fatal(err) 736 } 737 listener.Close() 738 } 739 740 } 741 742 // Helpers to reduce boilerplate code 743 744 func MkdirOrDie(name string) { 745 err := os.MkdirAll(name, os.ModePerm) 746 if err != nil { 747 log.Fatal(err) 748 } 749 } 750 751 func CreateOrDie(name string) *os.File { 752 f, err := os.Create(name) 753 if err != nil { 754 log.Fatal(err) 755 } 756 return f 757 } 758 759 func OpenOrDie(name string) *os.File { 760 f, err := os.Open(name) 761 if err != nil { 762 log.Fatal(err) 763 } 764 return f 765 } 766 767 func RemoveOrDie(name string) { 768 err := os.RemoveAll(name) 769 if err != nil { 770 log.Fatal(err) 771 } 772 } 773 774 func GenerateTCPConnPair() (*net.TCPConn, *net.TCPConn) { 775 addr, err := net.ResolveTCPAddr("tcp", ipport) 776 if err != nil { 777 log.Fatal(err) 778 } 779 listener, err := net.ListenTCP("tcp", addr) 780 if err != nil { 781 log.Fatal(err) 782 } 783 defer listener.Close() 784 clientConn, err := net.DialTCP("tcp", nil, addr) 785 if err != nil { 786 log.Fatal(err) 787 } 788 serverConn, err := listener.AcceptTCP() 789 if err != nil { 790 log.Fatal(err) 791 } 792 return serverConn, clientConn 793 }