using System;
using System.Diagnostics ;
using System.Linq ;
namespace MemoryPerformance
{
class Program
{
static void Main( string[ ] args)
{
const int count = 100000000 ;
int [ ] intArray = Enumerable.Range ( 0 , count) .ToArray ( ) ;
long [ ] longArray = intArray.Select ( x => ( long ) x) .ToArray ( ) ;
for ( int i = 0 ; i < 4 ; i++ ) {
Measure( ( ) => intSum( intArray) , " int sum" ) ;
Measure( ( ) => longSum( longArray) , "long sum" ) ;
Measure( ( ) => noSum( longArray) , " no sum" ) ;
}
}
static long intSum( int [ ] array)
{
long sum = 0 ;
for ( int i = 0 ; i < array.Length ; i ++ ) sum += array[ i] ;
return sum;
}
static long longSum( long [ ] array)
{
long sum = 0 ;
for ( int i = 0 ; i < array.Length ; i ++ ) sum += array[ i] ;
return sum;
}
static long noSum( long [ ] array)
{
long sum = 0 ;
for ( int i = 0 ; i < array.Length ; i ++ ) sum += i;
return sum;
}
static void Measure( Func< long> action, string description)
{
Stopwatch stopwatch = new Stopwatch( ) ;
stopwatch.Start ( ) ;
long result = action( ) ;
stopwatch.Stop ( ) ;
Console.WriteLine ( $"{description} took {stopwatch.ElapsedMilliseconds} ms ({result})" ) ;
}
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uRGlhZ25vc3RpY3M7CnVzaW5nIFN5c3RlbS5MaW5xOwoKbmFtZXNwYWNlIE1lbW9yeVBlcmZvcm1hbmNlCnsKICAgIGNsYXNzIFByb2dyYW0KICAgIHsKICAgICAgICBzdGF0aWMgdm9pZCBNYWluKHN0cmluZ1tdIGFyZ3MpCiAgICAgICAgewogICAgICAgICAgICBjb25zdCBpbnQgY291bnQgPSAxMDAwMDAwMDA7CiAgICAgICAgICAgIGludFtdIGludEFycmF5ID0gRW51bWVyYWJsZS5SYW5nZSgwLCBjb3VudCkuVG9BcnJheSgpOwogICAgICAgICAgICBsb25nW10gbG9uZ0FycmF5ID0gaW50QXJyYXkuU2VsZWN0KHggPT4gKGxvbmcpeCkuVG9BcnJheSgpOwogICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewogICAgICAgICAgICAgICAgTWVhc3VyZSgoKSA9PiBpbnRTdW0oaW50QXJyYXkpLCAiIGludCBzdW0iKTsKICAgICAgICAgICAgICAgIE1lYXN1cmUoKCkgPT4gbG9uZ1N1bShsb25nQXJyYXkpLCAibG9uZyBzdW0iKTsKICAgICAgICAgICAgICAgIE1lYXN1cmUoKCkgPT4gbm9TdW0obG9uZ0FycmF5KSwgIiAgbm8gc3VtIik7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHN0YXRpYyBsb25nIGludFN1bShpbnRbXSBhcnJheSkKICAgICAgICB7CiAgICAgICAgICAgIGxvbmcgc3VtID0gMDsKICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheS5MZW5ndGg7IGkgKyspIHN1bSArPSBhcnJheVtpXTsKICAgICAgICAgICAgcmV0dXJuIHN1bTsKICAgICAgICB9CgogICAgICAgIHN0YXRpYyBsb25nIGxvbmdTdW0obG9uZ1tdIGFycmF5KQogICAgICAgIHsKICAgICAgICAgICAgbG9uZyBzdW0gPSAwOwogICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFycmF5Lkxlbmd0aDsgaSArKykgc3VtICs9IGFycmF5W2ldOwogICAgICAgICAgICByZXR1cm4gc3VtOwogICAgICAgIH0KCiAgICAgICAgc3RhdGljIGxvbmcgbm9TdW0obG9uZ1tdIGFycmF5KQogICAgICAgIHsKICAgICAgICAgICAgbG9uZyBzdW0gPSAwOwogICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFycmF5Lkxlbmd0aDsgaSArKykgc3VtICs9IGk7CiAgICAgICAgICAgIHJldHVybiBzdW07CiAgICAgICAgfQoKICAgICAgICBzdGF0aWMgdm9pZCBNZWFzdXJlKEZ1bmM8bG9uZz4gYWN0aW9uLCBzdHJpbmcgZGVzY3JpcHRpb24pCiAgICAgICAgewogICAgICAgICAgICBTdG9wd2F0Y2ggc3RvcHdhdGNoID0gbmV3IFN0b3B3YXRjaCgpOwogICAgICAgICAgICBzdG9wd2F0Y2guU3RhcnQoKTsKICAgICAgICAgICAgbG9uZyByZXN1bHQgPSBhY3Rpb24oKTsKICAgICAgICAgICAgc3RvcHdhdGNoLlN0b3AoKTsKICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoJCJ7ZGVzY3JpcHRpb259IHRvb2sge3N0b3B3YXRjaC5FbGFwc2VkTWlsbGlzZWNvbmRzfSBtcyAoe3Jlc3VsdH0pIik7CiAgICAgICAgfQogICAgfQp9