blob: 1320ac5771472067801c11cfb295c3814c3f2699 [file] [log] [blame]
//===--- ObjectAllocation.swift -------------------------------------------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//
import TestsUtils
// This test checks the performance of allocations.
// 53% _swift_release_dealloc
// 30% _swift_alloc_object
// 10% retain/release
public var ObjectAllocation = BenchmarkInfo(
name: "ObjectAllocation",
runFunction: run_ObjectAllocation,
tags: [.runtime, .cpubench]
)
final class XX {
var xx: Int
init(_ x: Int) {
xx = x
}
}
final class TreeNode {
let left: XX
let right: XX
init(_ l: XX, _ r: XX) {
left = l
right = r
}
}
final class LinkedNode {
var next: LinkedNode?
var xx: Int
init(_ x: Int, _ n: LinkedNode?) {
xx = x
next = n
}
}
@inline(never)
func getInt(_ x: XX) -> Int {
return x.xx
}
@inline(never)
func testSingleObject() -> Int {
var s = 0
for i in 0..<1000 {
let x = XX(i)
s += getInt(x)
}
return s
}
@inline(never)
func addInts(_ t: TreeNode) -> Int {
return t.left.xx + t.right.xx
}
@inline(never)
func testTree() -> Int {
var s = 0
for i in 0..<300 {
let t = TreeNode(XX(i), XX(i + 1))
s += addInts(t)
}
return s
}
@inline(never)
func addAllInts(_ n: LinkedNode) -> Int {
var s = 0
var iter: LinkedNode? = n
while let iter2 = iter {
s += iter2.xx
iter = iter2.next
}
return s
}
@inline(never)
func testList() -> Int {
var s = 0
for i in 0..<250 {
let l = LinkedNode(i, LinkedNode(27, LinkedNode(42, nil)))
s += addAllInts(l)
}
return s
}
@inline(never)
func identity(_ x: Int) -> Int {
return x
}
@inline(never)
func testArray() -> Int {
var s = 0
for _ in 0..<1000 {
for i in [0, 1, 2] {
s += identity(i)
}
}
return s
}
@inline(never)
public func run_ObjectAllocation(_ N: Int) {
var SingleObjectResult = 0
var TreeResult = 0
var ListResult = 0
var ArrayResult = 0
for _ in 0..<N {
SingleObjectResult = testSingleObject()
TreeResult = testTree()
ListResult = testList()
ArrayResult = testArray()
}
CheckResults(SingleObjectResult == 499500)
CheckResults(TreeResult == 90000)
CheckResults(ListResult == 48375)
CheckResults(ArrayResult == 3000)
}