visual studio 2013 conformance performance productivity services mobile devices what’s next
TRANSCRIPT
Tarek Madkour Daniel GriffingGroup Program Manager QA LeadMicrosoft Visual C++ Microsoft Visual C++
Modern C++ Developmentwith Visual C++ 2013
Visual C++: Cadence
• Faster and more regular delivery cadence• Updates provide servicing fixes and new
features• Additional out-of-band releases• CTP compiler with additional C++11/14 conformance• Rename refactoring• PDB-based project• PGO plug-in, SpeedCop
• OSS libraries
VS 2008 VS 2010 VS 2012 VS 2013
VS Updates
Visual C++ ISO Conformance
• Targeting C++14• Big step improvements in major
releases• Incremental improvements in CTPs• VS Updates focus on compatibility
Explicit conversion operators
Non-static data member initializers
__func__Extended sizeof
Thread-safe function local static
init
Inline namespaces
constexpr (incl. ctors, literal
types)
Raw string literals = defaultImplicit move
generationalignofalignas
Universal character names
in literals
Expression SFINAE
Function template default arguments
= deleteRef-qualifiers:
& and && for *thisnoexcept
(unconditional)noexcept
(incl. conditional)
C++11 preprocessor
(incl. C++98 & C11)
Delegating constructors
“using” aliasesC++14 libs: type
aliases
C++14 decltype(auto)
Inheriting constructors
char16_t, char32_tAttributes
C++98 two-phase lookup
Uniform init & initializer_lists
C99 variable declsC99 _Bool
C++14 auto function return type
deductionUser-defined literals thread_local
C++14 generalized constexpr
Variadic templatesC99 compound
literalsC++14 generic
lambdas (partial)C++14 generalized
lambda captureUnrestricted
unionsC++14 variable
templates
C++14 libs: cbegin/ greater<>/make_uni
que
C99 designated initializers
C++TS? async/await (partial)
C++14 libs: std:: user-defined literals
constexpr (except ctors, literal types)
C++TS concepts lite
C++11/14
VC++ 2013
Explicit conversion operators
Non-static data member initializers
__func__Extended sizeof
Thread-safe function local static
init
Inline namespaces
constexpr (incl. ctors, literal
types)
Raw string literals = defaultImplicit move
generationalignofalignas
Universal character names
in literals
Expression SFINAE
Function template default arguments
= deleteRef-qualifiers:
& and && for *thisnoexcept
(unconditional)noexcept
(incl. conditional)
C++11 preprocessor
(incl. C++98 & C11)
Delegating constructors
“using” aliasesC++14 libs: type
aliases
C++14 decltype(auto)
Inheriting constructors
char16_t, char32_tAttributes
C++98 two-phase lookup
Uniform init & initializer_lists
C99 variable declsC99 _Bool
C++14 auto function return type
deductionUser-defined literals thread_local
C++14 generalized constexpr
Variadic templatesC99 compound
literalsC++14 generic
lambdas (partial)C++14 generalized
lambda captureUnrestricted
unionsC++14 variable
templates
C++14 libs: cbegin/ greater<>/make_uni
que
C99 designated initializers
C++TS? async/await (partial)
C++14 libs: std:: user-defined literals
constexpr (except ctors, literal types)
C++TS concepts lite
C++11/14
VC++ 2013 VC++ Nov 2013 CTP
Explicit conversion operators
Non-static data member initializers
__func__Extended sizeof
Thread-safe function local static
init
Inline namespaces
constexpr (incl. ctors, literal
types)
Raw string literals = defaultImplicit move
generationalignofalignas
Universal character names
in literals
Expression SFINAE
Function template default arguments
= deleteRef-qualifiers:
& and && for *thisnoexcept
(unconditional)noexcept
(incl. conditional)
C++11 preprocessor
(incl. C++98 & C11)
Delegating constructors
“using” aliasesC++14 libs: type
aliases
C++14 decltype(auto)
Inheriting constructors
char16_t, char32_tAttributes
C++98 two-phase lookup
Uniform init & initializer_lists
C99 variable declsC99 _Bool
C++14 auto function return type
deductionUser-defined literals thread_local
C++14 generalized constexpr
Variadic templatesC99 compound
literalsC++14 generic
lambdas (partial)C++14 generalized
lambda captureUnrestricted
unionsC++14 variable
templates
C++14 libs: cbegin/ greater<>/make_uni
que
C99 designated initializers
C++TS? async/await (partial)
C++14 libs: std:: user-defined literals
constexpr (except ctors, literal types)
C++TS concepts lite
C++11/14
VC++ 2013 VC++ Nov 2013 CTP VC++ Next CTP
Explicit conversion operators
Non-static data member initializers
__func__Extended sizeof
Thread-safe function local static
init
Inline namespaces
constexpr (incl. ctors, literal
types)
Raw string literals = defaultImplicit move
generationalignofalignas
Universal character names
in literals
Expression SFINAE
Function template default arguments
= deleteRef-qualifiers:
& and && for *thisnoexcept
(unconditional)noexcept
(incl. conditional)
C++11 preprocessor
(incl. C++98 & C11)
Delegating constructors
“using” aliasesC++14 libs: type
aliases
C++14 decltype(auto)
Inheriting constructors
char16_t, char32_tAttributes
C++98 two-phase lookup
Uniform init & initializer_lists
C99 variable declsC99 _Bool
C++14 auto function return type
deductionUser-defined literals thread_local
C++14 generalized constexpr
Variadic templatesC99 compound
literalsC++14 generic
lambdas (partial)C++14 generalized
lambda captureUnrestricted
unionsC++14 variable
templates
C++14 libs: cbegin/ greater<>/make_uni
que
C99 designated initializers
C++TS? async/await (partial)
C++14 libs: std:: user-defined literals
constexpr (except ctors, literal types)
C++TS concepts lite
C++11/14Yes
Maybe
Performance Optimizations Recap• Compilation Unit
Optimizations• /O2 and friends
• Whole Program Optimizations
• /GL and /LTCG
.cpp
.cpp .obj
.obj
.exe
.cpp
.cpp .obj
.obj
.exe
.cpp
.cpp .obj
.obj
.exe
Run TrainingScenario
s
.exe
Profile-Guided Optimizations• /LTCG:PGI and /LTCG:PGO
Automatic Vectorization
• VS 2012:• Uses “vector” instructions where
possible in loops
• VS 2013 adds:• Statement level vectorization
• Permutation of perfect loop nests
• Range propagation optimizations
• Support for more operations: min/max, converts, shifts, byteswap, averaging
• Reductions into array elements
• __restrict support for vector alias checking
• Improvements to data dependence analysis
• C++ pointer vectorization
• Gather / scatter optimizations
for (i = 0; i < 1000; i++) { A[i] = B[i] + C[i];}
+
r1 r2
r3
add r3, r1, r2
SCALAR(1 operation)
v1 v2
v3
+
vectorlength
vadd v3, v1, v2
VECTOR(N operations)
Automatic Vectorization// STL – pointers everywhere; not even a loop counter variablevoid transform1(const int * first1, const int * last1, const int * first2, int * result) { while (first1 != last1) { //converted to integer *result++ = *first1++ + *first2++; // make these array references }}// DirectX – no loops here! Vectorize operations on adjacent memory cellsvoid four_vector_example(XMVECTOR V) { XMVECTOR Result; Result.vector4_f32[0] = 1.f / V.vector4_f32[0]; Result.vector4_f32[1] = 1.f / V.vector4_f32[1]; Result.vector4_f32[2] = 1.f / V.vector4_f32[2]; Result.vector4_f32[3] = 1.f / V.vector4_f32[3]; return Result;}
// Machine Vision Libraryvoid machine_vision_filter_example (int *A, int boxStart) { for (int i = 0; i < 100; i++) A[boxStart + i] = A[boxStart + i] + 1;}
Vector Calling Convention
struct Particle { __m256 x; __m256 y; __m256 z; __m256 w; };Particle __vectorcall foo(Particle a, __m256 scale){ Particle t; t.x = _mm256_mul_ps(a.x, scale); t.y = _mm256_mul_ps(a.y, scale); t.z = _mm256_mul_ps(a.z, scale); t.w = _mm256_mul_ps(a.w, scale); return t;}
Reduces instruction count
Minimizes stack allocation
Use /Gv for whole module
C++ AMP
In VS2012:
• Programming model for heterogeneous computing
• Allowed C++ code to run on the GPU for general-purpose computation
• STL-like library for multidimensional data
#include <iostream>#include <amp.h>using namespace concurrency;
int main(){ int v[11] = {'G','d','k','k','n',31,'v','n','q','k','c'}; array_view<int> av(11, v); parallel_for_each(av.extent, [=](index<1> idx) restrict(amp) { av[idx] += 1; }); for(unsigned int i = 0; i < 11; i++) std::cout << static_cast<char>(av[i]); }
C++ AMP
VS2013 focused on:• Cross-platform support• More runtime performance gains• Developer productivity
For example:• Targeting Linux, iOS and Android• Shared memory support to eliminate/reduce copying of data between CPU and GPU• Enhanced texture support: texture sampling, mipmap support and staging textures• C++ AMP debugging on Win7 and side-by-side CPU/GPU debugging• Faster C++ AMP runtime: improved copy performance, reduce launch overhead• Better DirectX interop support• Improved C++ AMP runtime diagnostics• Improvements to array_view APIs
Tour of the VS2013 IDE
• Code formatting, brace completion• Rename refactoring• Header/cpp switching• Code peek• Find All References• Code analysis• PDB project• NuGet for native code• Native multi-targeting• Code understanding using dependency graph
Code Formatting
• Configurable options for indentation, space, new lines and wrapping
• Automatically applied while typing, pasting or formatting
NuGet
• Easy acquisition and usage of compatible libraries in C++ projects
• Library vendors can expose their libraries as NuGet packages using available tools
http://blogs.msdn.com/b/vcblog/archive/2013/04/26/nuget-for-c.aspx
Code Analysis UI Enhancements
• Filter on categories and sort on various fields to help focus on important problems first
Async Debugging• Supports Windows Store and Desktop
apps• Requires Windows 8.1• Enhancements to the Call Stack and
Tasks window • Answers the questions “Why am I here?” & “What is going on right
now?”
“Just My Code” debugging• Helps developer focus on code they
authored
• Call Stack window hides non-user code
• Non-user code defined in configurable .natjmc file
• Not used during stepping
Interop debugging
• Multiple flavors of interop debugging enabled:
• JavaScript / C++• C# / VB / C++ • CPython / C++• GPU / CPU
• Enable by choosing an option in the Project Properties• Break in the debugger in either C++ or JS/C#/VB/Python code• Breakpoint | Exception | Break All (pause icon)
• Inspect state, e.g. in Locals, Call Stack
C++ REST SDK
• Cloud-based client-server communications library for C++
• Basics:
• Connecting and interacting with RESTful services
• Uncompromised performance and productivity
• Asynchrony for responsiveness and scalability
• Uses modern C++11 patterns
• Cross-platform enabled and OSS
C++ REST SDK
• HTTP Client to send requests and handle responses
• JSON library for constructing, parsing and serializing JSON objects.• Asynchronous Streams and Stream Buffers for reading/writing bytes to/from an underlying medium.
• http://casablanca.codeplex.com
Basic HTTP Client
http_client client(L"http://www.myhttpserver.com");http_request request(methods::GET);
client.request(request).then([](http_response response){ // Perform actions here to inspect the HTTP response... if(response.status_code() == status_codes::OK) { }});
Make an HTTP request to get a JSON value
void RequestJSONValue(){ http_client client(L"http://www.myhttpserver.com"); client.request(methods::GET).then([](http_response response) { if(response.status_code() == status_codes::OK) { return response.extract_json(); } // Handle error cases, for now return null json value... return task_from_result(json::value()); }) .then([](json::value v) { // Perform actions here to process the JSON value... });}
Connected Windows Store Apps
• Visual Studio 2013 makes it easier to:• Update your app tile using mobile services• Send push notifications to your Windows Store app• Accessing Azure mobile services backend capabilities
• How?• New C++ library for Azure mobile services• Integrated VS tools
Better XAML Designer
• New and updated templates• Improved XAML editor• Rulers and dynamic guides• New Windows 8.1 controls• Improved Designer performance• Better in-place style and template editing
Powerful Graphics Debugging
• VS2012 introduced DirectX-based Graphics debugging tools in VS Professional, Premium and Ultimate
• VS2013 adds:• Support in VS Express• Capturing frames from
remote machines• Compute shader
debugging• Faster frame capture
Deeper Diagnostics
• Diagnostics hub• XAML UI responsiveness profiling• Energy profiler• CPU profiling• Better WinRT Exception debugging• ‘Just My Code’ debugging• Improved Async debugging• JavaScript/C++ interop debugging• C#/C++ interop debugging *• ARM dump debugging *
C++/CX
• Boxed types in WinRT structs• value struct Person {• IBox<int>^ Age;• }
• Overriding ToString()• ref struct Person {• public:• String^ Name;• virtual String^ ToString()
override • { return Name; }• }
• Improved WinRT exceptions• Retains stack trace and message
string across the ABI• Developers can specify custom
message strings
• Faster performance• Ref classes instantiate faster,
have more compact layouts in memory
• Boxing and factory caching improved to speed up XAML scenarios
• Facilitated inlining and other code optimizations
• Performance• Productivity• Libraries: full acquisition story• Gaming and DX• Parallel paradigms: parallel STL, await• Native Desktop UI
More
© 2013 Microsoft Corporation. All rights reserved. Microsoft, Windows, Windows Vista and other product names are or may be registered trademarks and/or trademarks in the U.S. and/or other countries.The information herein is for informational purposes only and represents the current view of Microsoft Corporation as of the date of this presentation. Because Microsoft must respond to changing market conditions, it should not be interpreted to be a commitment on the part of Microsoft, and Microsoft cannot guarantee the accuracy of any information provided after the date of this presentation. MICROSOFT MAKES NO WARRANTIES, EXPRESS, IMPLIED OR STATUTORY, AS TO THE INFORMATION IN THIS PRESENTATION.