Skip to content

Commit

Permalink
fix parsed type leak. Also update performance test
Browse files Browse the repository at this point in the history
  • Loading branch information
Alexander Ivlev committed Apr 6, 2021
1 parent e0129f3 commit d93c366
Show file tree
Hide file tree
Showing 7 changed files with 54 additions and 48 deletions.
1 change: 1 addition & 0 deletions .gitignore
Expand Up @@ -70,3 +70,4 @@ Samples/CompareSpeedSwinjectVSTranquillity/CompareSpeedSwinjectVSTranquillity.xc
Pods
IDEWorkspaceChecks.plist
Package.resolved
Samples/DITranquillityPerformanceTest/DITranquillityTest.xcodeproj/xcshareddata/xcbaselines
3 changes: 3 additions & 0 deletions CHANGELOG.md
@@ -1,3 +1,6 @@
# v4.2.1
* Fix memory leak ParsedType. About bug in comments [#159](https://github.com/ivlevAstef/DITranquillity/issues/159) issue

# v4.2.0
* Add new settings - enable disable multithread support. Default enable.
* Improve resolve speed - fix small performance bug.
Expand Down
2 changes: 1 addition & 1 deletion DITranquillity.podspec
@@ -1,7 +1,7 @@
Pod::Spec.new do |s|

s.name = 'DITranquillity'
s.version = '4.2.0'
s.version = '4.2.1'
s.summary = 'DITranquillity - Dependency injection for iOS/macOS/tvOS (Swift) '

s.description = <<-DESC
Expand Down
16 changes: 8 additions & 8 deletions DITranquillity.xcodeproj/project.pbxproj
Expand Up @@ -1220,7 +1220,7 @@
"@loader_path/Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = 10.10;
MARKETING_VERSION = 4.2.0;
MARKETING_VERSION = 4.2.1;
OTHER_SWIFT_FLAGS = "";
PRODUCT_BUNDLE_IDENTIFIER = "com.sia.DITranquillity-OSX";
PRODUCT_NAME = DITranquillity;
Expand Down Expand Up @@ -1260,7 +1260,7 @@
"@loader_path/Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = 10.10;
MARKETING_VERSION = 4.2.0;
MARKETING_VERSION = 4.2.1;
OTHER_SWIFT_FLAGS = "";
PRODUCT_BUNDLE_IDENTIFIER = "com.sia.DITranquillity-OSX";
PRODUCT_NAME = DITranquillity;
Expand Down Expand Up @@ -1301,7 +1301,7 @@
"@loader_path/Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = 10.10;
MARKETING_VERSION = 4.2.0;
MARKETING_VERSION = 4.2.1;
OTHER_SWIFT_FLAGS = "";
PRODUCT_BUNDLE_IDENTIFIER = "com.sia.DITranquillity-tvOS";
PRODUCT_MODULE_NAME = DITranquillity;
Expand Down Expand Up @@ -1344,7 +1344,7 @@
"@loader_path/Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = 10.10;
MARKETING_VERSION = 4.2.0;
MARKETING_VERSION = 4.2.1;
OTHER_SWIFT_FLAGS = "";
PRODUCT_BUNDLE_IDENTIFIER = "com.sia.DITranquillity-tvOS";
PRODUCT_MODULE_NAME = DITranquillity;
Expand Down Expand Up @@ -1507,7 +1507,7 @@
"@loader_path/Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = 10.10;
MARKETING_VERSION = 4.2.0;
MARKETING_VERSION = 4.2.1;
OTHER_SWIFT_FLAGS = "";
PRODUCT_BUNDLE_IDENTIFIER = "com.sia.DITranquillity-iOS";
PRODUCT_NAME = DITranquillity;
Expand Down Expand Up @@ -1551,7 +1551,7 @@
"@loader_path/Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = 10.10;
MARKETING_VERSION = 4.2.0;
MARKETING_VERSION = 4.2.1;
OTHER_SWIFT_FLAGS = "";
PRODUCT_BUNDLE_IDENTIFIER = "com.sia.DITranquillity-iOS";
PRODUCT_NAME = DITranquillity;
Expand Down Expand Up @@ -1594,7 +1594,7 @@
"@loader_path/Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = 10.10;
MARKETING_VERSION = 4.2.0;
MARKETING_VERSION = 4.2.1;
OTHER_SWIFT_FLAGS = "";
PRODUCT_BUNDLE_IDENTIFIER = "com.sia.DITranquillity-WatchOS";
PRODUCT_MODULE_NAME = DITranquillity;
Expand Down Expand Up @@ -1640,7 +1640,7 @@
"@loader_path/Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = 10.10;
MARKETING_VERSION = 4.2.0;
MARKETING_VERSION = 4.2.1;
OTHER_SWIFT_FLAGS = "";
PRODUCT_BUNDLE_IDENTIFIER = "com.sia.DITranquillity-WatchOS";
PRODUCT_MODULE_NAME = DITranquillity;
Expand Down
Expand Up @@ -23,7 +23,7 @@
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
buildConfiguration = "Release"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
Expand Down
Expand Up @@ -26,49 +26,47 @@ private class PerformanceTest {

class DITranquillityTests_Performance: XCTestCase {
/*
/// time for core i7-6800K in virtual machine
/// time for 9 GHz 6-Core Intel Core i9
register count:
1000 = 0.040
2000 = 0.135
4000 = 0.532
8000 = 2.217
not linear!!!
but 1k classes it's more.
0.000008 per register
1000 = 0,00342 s
2000 = 0,00694 s
4000 = 0,0121 s
8000 = 0,023 s
linear - 0.000004 per register
parameters count (for 2000):
0 = 0.131
1 = 0.135
2 = 0.134
3 = 0.137
8 = 0.136
0 = 0,00788 s
1 = 0,00945 s
2 = 0,0101 s
3 = 0,0111 s
8 = 0,0141 s
linear - 0.001 sec or 0.5%
increase register time on 0.0000005 per parameter
resolve (for 50000):
prototype = 0.101
objectGraph = 0.264
single = 0.227
0.000003 per resolve with one register
prototype = 0,0197 s
objectGraph = 0,0353 s
single = 0,104 s
resolve by register count (for 50000):
250 = 0.419
500 = 0.798
1000 = 1.607
2000 = 3.726
250 = 0,35 s
500 = 0,647 s
1000 = 1,27 s
2000 = 2,63 s
linear
resolve type increase on 0.0011 (for 50000) per one register
0.00002 per resolve with 1000 register
inject count (for 2000):
1 = 0.137
2 = 0.142
4 = 0.146
8 = 0.163
16 = 0.216
not linear, but this is not critical
increase register time on 0.000022 per injection
1 = 0,0126 s
2 = 0,0168 s
4 = 0,0273 s
8 = 0,046 s
16 = 0,0832 s
around linear, but this is not critical
complex prototype (for 1000): 0,551 s
complex objectGraph (for 1000): 0,119 s
*/

func test01_registerType() {
Expand Down
22 changes: 13 additions & 9 deletions Sources/Core/Internal/ParsedType.swift
Expand Up @@ -12,21 +12,27 @@ final class ParsedType {
let sType: SpecificType.Type?
let parent: ParsedType?

private(set) lazy var base: ParsedType = {
var base: ParsedType { _base ?? makeBase() }
private unowned var _base: ParsedType? = nil
private func makeBase() -> ParsedType {
var iter = self
while let parent = iter.parent {
iter = parent
iter = parent
}
_base = iter
return iter
}()
}

private(set) lazy var firstNotSwiftType: ParsedType = {
var firstNotSwiftType: ParsedType { _firstNotSwiftType ?? makeFirstNotSwiftType() }
private unowned var _firstNotSwiftType: ParsedType? = nil
private func makeFirstNotSwiftType() -> ParsedType {
var iter = self
while let sType = iter.sType, let parent = iter.parent, sType.isSwiftType {
iter = parent
}
_firstNotSwiftType = iter
return iter
}()
}

private(set) lazy var many: Bool = { return sType?.many ?? false }()
private(set) lazy var optional: Bool = {
Expand Down Expand Up @@ -97,11 +103,9 @@ final class ParsedType {
return nil
}

@inline(__always)
private func oGet(_ value1: Bool?, _ value2: @autoclosure () -> Bool?) -> Bool
{
private func oGet(_ value1: Bool?, _ value2: @autoclosure () -> Bool?) -> Bool {
if true == value1 {
return true
return true
}
return value2() ?? false
}
Expand Down

0 comments on commit d93c366

Please sign in to comment.