[Issue 12442] New: inefficient code with scope(exit)
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Sun Mar 23 01:56:06 PDT 2014
https://d.puremagic.com/issues/show_bug.cgi?id=12442
Summary: inefficient code with scope(exit)
Product: D
Version: D2
Platform: All
OS/Version: All
Status: NEW
Keywords: performance
Severity: normal
Priority: P2
Component: DMD
AssignedTo: nobody at puremagic.com
ReportedBy: r.sagitario at gmx.de
--- Comment #0 from Rainer Schuetze <r.sagitario at gmx.de> 2014-03-23 01:55:50 PDT ---
Usage of scope(exit) comes with a significant performance cost, even if the
executed code is "nothrow":
/////////////////////////
uint fun() nothrow;
__gshared int recurse;
uint wrapper_scopeexit()
{
recurse++;
scope(exit) recurse--;
return fun();
}
uint wrapper_linear()
{
recurse++;
uint rc = fun();
recurse--;
return rc;
}
//////////////////////////
This is the assembly for Win64 with "-O":
_D4test17wrapper_scopeexitFZk:
0000000000000000: 55 push rbp
0000000000000001: 48 8B EC mov rbp,rsp
0000000000000004: 48 83 EC 18 sub rsp,18h
0000000000000008: 53 push rbx
0000000000000009: 56 push rsi
000000000000000A: 57 push rdi
000000000000000B: 41 54 push r12
000000000000000D: 41 55 push r13
000000000000000F: 41 56 push r14
0000000000000011: 41 57 push r15
0000000000000013: FF 05 00 00 00 00 inc dword ptr [_D4test7recursei]
0000000000000019: 48 83 EC 20 sub rsp,20h
000000000000001D: E8 00 00 00 00 call _D4test3funFNbZk
0000000000000022: 48 83 C4 20 add rsp,20h
0000000000000026: 48 89 45 F8 mov qword ptr [rbp-8],rax
000000000000002A: 48 83 EC 08 sub rsp,8
000000000000002E: E8 28 00 00 00 call 000000000000005B
0000000000000033: 48 83 C4 08 add rsp,8
0000000000000037: 48 8B 45 F8 mov rax,qword ptr [rbp-8]
000000000000003B: 41 5F pop r15
000000000000003D: 41 5E pop r14
000000000000003F: 41 5D pop r13
0000000000000041: 41 5C pop r12
0000000000000043: 5F pop rdi
0000000000000044: 5E pop rsi
0000000000000045: 5B pop rbx
0000000000000046: 48 8D 65 00 lea rsp,[rbp]
000000000000004A: 5D pop rbp
000000000000004B: C3 ret
000000000000004C: 48 83 EC 08 sub rsp,8
0000000000000050: E8 06 00 00 00 call 000000000000005B
0000000000000055: 48 83 C4 08 add rsp,8
0000000000000059: EB 07 jmp 0000000000000062
000000000000005B: FF 0D 00 00 00 00 dec dword ptr [_D4test7recursei]
0000000000000061: C3 ret
0000000000000062: 41 5F pop r15
0000000000000064: 41 5E pop r14
0000000000000066: 41 5D pop r13
0000000000000068: 41 5C pop r12
000000000000006A: 5F pop rdi
000000000000006B: 5E pop rsi
000000000000006C: 5B pop rbx
000000000000006D: 48 8D 65 00 lea rsp,[rbp]
0000000000000071: 5D pop rbp
0000000000000072: C3 ret
_D4test14wrapper_linearFZk:
0000000000000000: 55 push rbp
0000000000000001: 48 8B EC mov rbp,rsp
0000000000000004: FF 05 00 00 00 00 inc dword ptr [_D4test7recursei]
000000000000000A: 48 83 EC 20 sub rsp,20h
000000000000000E: E8 00 00 00 00 call _D4test3funFNbZk
0000000000000013: 48 83 C4 20 add rsp,20h
0000000000000017: FF 0D 00 00 00 00 dec dword ptr [_D4test7recursei]
000000000000001D: 5D pop rbp
000000000000001E: C3 ret
For Win32, it is slightly worse because the exception frames are still set up:
_D4test17wrapper_scopeexitFZk comdat
assume CS:_D4test17wrapper_scopeexitFZk
L0: push EBP
mov EBP,ESP
mov EDX,FS:__except_list
push 0FFFFFFFFh
push offset _D4test17wrapper_scopeexitFZk[07Ch]
push EDX
mov FS:__except_list,ESP
sub ESP,8
push EBX
push ESI
push EDI
inc dword ptr _D4test7recursei
mov dword ptr -4[EBP],0
call near ptr _D4test3funFNbZk
mov dword ptr -4[EBP],0FFFFFFFFh
push EAX
call near ptr L5A
pop EAX
mov ECX,-0Ch[EBP]
mov FS:__except_list,ECX
pop EDI
pop ESI
pop EBX
mov ESP,EBP
pop EBP
ret
call near ptr L5A
jmp short L68
L5A: mov dword ptr -4[EBP],0FFFFFFFFh
dec dword ptr _D4test7recursei
ret
L68: mov ECX,-0Ch[EBP]
mov FS:__except_list,ECX
pop EDI
pop ESI
pop EBX
mov ESP,EBP
pop EBP
ret
mov EAX,offset FLAT:_DATA
jmp near ptr __d_framehandler
_D4test17wrapper_scopeexitFZk ends
_D4test14wrapper_linearFZk comdat
assume CS:_D4test14wrapper_linearFZk
L0: push EAX
inc dword ptr _D4test7recursei
call near ptr _D4test3funFNbZk
dec dword ptr _D4test7recursei
pop ECX
ret
_D4test14wrapper_linearFZk ends
In addition, even if the code might throw, the usual path should inline the
code for scope(exit) instead of calling the exception handler.
--
Configure issuemail: https://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
More information about the Digitalmars-d-bugs
mailing list