Re[13]: CIL switch и сопоставление с образцом
От: Воронков Василий Россия  
Дата: 15.09.10 07:52
Оценка: 12 (1)
Здравствуйте, hardcase, Вы писали:

H>Здравствуйте, Ka3a4oK, Вы писали:


KK>>1. небольшие дыры -> таблица с константным временем

KK>>2. большие дыры -> бинарный поиск(или может даже хэш-таблица при большом количестве элементов)


H>Что-то я сомневаюсь в том, что C# компилятор производит оптимизацию №2.

H>На каком количестве разреженных вхождений бинарный поиск будет в среднем быстрее линейного?


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            var x = 5;

            switch (x)
            {
                case 0: x += 1; break;
                case 5: x += 1; break;
                case 100: x += 1; break;
                case 200: x += 1; break;
                case 300: x += 1; break;
                case 400: x += 1; break;
                case 500: x += 1; break;
                case 600: x += 1; break;
                case 700: x += 1; break;
                case 800: x += 1; break;
                case 900: x += 1; break;
                case 1000: x += 1; break;
                case 1100: x += 1; break;
                case 1200: x += 1; break;
                case 1300: x += 1; break;
                case 1400: x += 1; break;
                case 1500: x += 1; break;
                case 1600: x += 1; break;

                case 1700: x += 1; break;
                case 1800: x += 1; break;
                case 1900: x += 1; break;
                case 2000: x += 1; break;

                case 2100: x += 1; break;
                case 2200: x += 1; break;
                case 2300: x += 1; break;

                case 2400: x += 1; break;
                case 2500: x += 1; break;
                case 2600: x += 1; break;
                case 2700: x += 1; break;
                case 2800: x += 1; break;
                case 2900: x += 1; break;
                case 3000: x += 1; break;
                case 3100: x += 1; break;

                case 3200: x += 1; break;
                case 3300: x += 1; break;
                case 3400: x += 1; break;
                case 3500: x += 1; break;
                case 3600: x += 1; break;
                case 3700: x += 1; break;
                case 3800: x += 1; break;
                case 3900: x += 1; break;
                case 4000: x += 1; break;
                case 4100: x += 1; break;

                case 4200: x += 1; break;
                case 4300: x += 1; break;
                case 4400: x += 1; break;
                case 4500: x += 1; break;
                case 4600: x += 1; break;
                case 4700: x += 1; break;
                case 4800: x += 1; break;
                case 4900: x += 1; break;

                case 5000: x += 1; break;
                case 5100: x += 1; break;
                case 5200: x += 1; break;
                case 5300: x += 1; break;
                case 5400: x += 1; break;
                case 5500: x += 1; break;
                case 5600: x += 1; break;
                case 5700: x += 1; break;
                case 5800: x += 1; break;
                case 5900: x += 1; break;
                case 6000: x += 1; break;
                case 6100: x += 1; break;

                case 6200: x += 1; break;
                case 6300: x += 1; break;
                case 6400: x += 1; break;
                case 6500: x += 1; break;
                case 6600: x += 1; break;
                case 6700: x += 1; break;
                case 6800: x += 1; break;
                case 6900: x += 1; break;
                case 7000: x += 1; break;
                case 7100: x += 1; break;

                case 7200: x += 1; break;
                case 7300: x += 1; break;
                case 7400: x += 1; break;
                case 7500: x += 1; break;
                case 7600: x += 1; break;
                case 7700: x += 1; break;
                case 7800: x += 1; break;
                case 7900: x += 1; break;
                case 8000: x += 1; break;
                case 8100: x += 1; break;

                case 8200: x += 1; break;
                case 8300: x += 1; break;
                case 8400: x += 1; break;
                case 8500: x += 1; break;
                case 8600: x += 1; break;
                case 8700: x += 1; break;
                case 8800: x += 1; break;
                case 8900: x += 1; break;

                case 9000: x += 1; break;
                case 9100: x += 1; break;
                case 9200: x += 1; break;
                case 9300: x += 1; break;
                case 9400: x += 1; break;
                case 9500: x += 1; break;
                case 9600: x += 1; break;
                case 9700: x += 1; break;
                case 9800: x += 1; break;
                case 9900: x += 1; break;
                case 10000: x += 1; break;

            }
        }
    }
}




.method private hidebysig static void Main(string[] args) cil managed
{
    .entrypoint
    .maxstack 2
    .locals init (
        [0] int32 x,
        [1] int32 CS$0$0000)
    L_0000: ldc.i4.5 
    L_0001: stloc.0 
    L_0002: ldloc.0 
    L_0003: stloc.1 
    L_0004: ldloc.1 
    L_0005: ldc.i4 0x1324
    L_000a: bgt L_02de
    L_000f: ldloc.1 
    L_0010: ldc.i4 0x8fc
    L_0015: bgt L_016b
    L_001a: ldloc.1 
    L_001b: ldc.i4 0x3e8
    L_0020: bgt L_00b7
    L_0025: ldloc.1 
    L_0026: ldc.i4 400
    L_002b: bgt.s L_006b
    L_002d: ldloc.1 
    L_002e: ldc.i4.s 100
    L_0030: bgt.s L_0049
    L_0032: ldloc.1 
    L_0033: ldc.i4.0 
    L_0034: beq L_05bb
    L_0039: ldloc.1 
    L_003a: ldc.i4.5 
    L_003b: beq L_05c0
    L_0040: ldloc.1 
    L_0041: ldc.i4.s 100
    L_0043: beq L_05c5
    L_0048: ret 
    L_0049: ldloc.1 
    L_004a: ldc.i4 200
    L_004f: beq L_05ca
    L_0054: ldloc.1 
    L_0055: ldc.i4 300
    L_005a: beq L_05cf
    L_005f: ldloc.1 
    L_0060: ldc.i4 400
    L_0065: beq L_05d4
    L_006a: ret 
    L_006b: ldloc.1 
    L_006c: ldc.i4 700
    L_0071: bgt.s L_0095
    L_0073: ldloc.1 
    L_0074: ldc.i4 500
    L_0079: beq L_05d9
    L_007e: ldloc.1 
    L_007f: ldc.i4 600
    L_0084: beq L_05de
    L_0089: ldloc.1 
    L_008a: ldc.i4 700
    L_008f: beq L_05e3
    L_0094: ret 
    L_0095: ldloc.1 
    L_0096: ldc.i4 800
    L_009b: beq L_05e8
    L_00a0: ldloc.1 
    L_00a1: ldc.i4 900
    L_00a6: beq L_05ed
    L_00ab: ldloc.1 
    L_00ac: ldc.i4 0x3e8
    L_00b1: beq L_05f2
    L_00b6: ret 
    L_00b7: ldloc.1 
    L_00b8: ldc.i4 0x640
    L_00bd: bgt.s L_010b
    L_00bf: ldloc.1 
    L_00c0: ldc.i4 0x514
    L_00c5: bgt.s L_00e9
    L_00c7: ldloc.1 
    L_00c8: ldc.i4 0x44c
    L_00cd: beq L_05f7
    L_00d2: ldloc.1 
    L_00d3: ldc.i4 0x4b0
    L_00d8: beq L_05fc
    L_00dd: ldloc.1 
    L_00de: ldc.i4 0x514
    L_00e3: beq L_0601
    L_00e8: ret 
    L_00e9: ldloc.1 
    L_00ea: ldc.i4 0x578
    L_00ef: beq L_0606
    L_00f4: ldloc.1 
    L_00f5: ldc.i4 0x5dc
    L_00fa: beq L_060b
    L_00ff: ldloc.1 
    L_0100: ldc.i4 0x640
    L_0105: beq L_0610
    L_010a: ret 
    L_010b: ldloc.1 
    L_010c: ldc.i4 0x76c
    L_0111: bgt.s L_0135
    L_0113: ldloc.1 
    L_0114: ldc.i4 0x6a4
    L_0119: beq L_0615
    L_011e: ldloc.1 
    L_011f: ldc.i4 0x708
    L_0124: beq L_061a
    L_0129: ldloc.1 
    L_012a: ldc.i4 0x76c
    L_012f: beq L_061f
    L_0134: ret 
    L_0135: ldloc.1 
    L_0136: ldc.i4 0x834
    L_013b: bgt.s L_0154
    L_013d: ldloc.1 
    L_013e: ldc.i4 0x7d0
    L_0143: beq L_0624
    L_0148: ldloc.1 
    L_0149: ldc.i4 0x834
    L_014e: beq L_0629
    L_0153: ret 
    L_0154: ldloc.1 
    L_0155: ldc.i4 0x898
    L_015a: beq L_062e
    L_015f: ldloc.1 
    L_0160: ldc.i4 0x8fc
    L_0165: beq L_0633
    L_016a: ret 
    L_016b: ldloc.1 
    L_016c: ldc.i4 0xe10
    L_0171: bgt L_022a
    L_0176: ldloc.1 
    L_0177: ldc.i4 0xb54
    L_017c: bgt.s L_01ca
    L_017e: ldloc.1 
    L_017f: ldc.i4 0xa28
    L_0184: bgt.s L_01a8
    L_0186: ldloc.1 
    L_0187: ldc.i4 0x960
    L_018c: beq L_0638
    L_0191: ldloc.1 
    L_0192: ldc.i4 0x9c4
    L_0197: beq L_063d
    L_019c: ldloc.1 
    L_019d: ldc.i4 0xa28
    L_01a2: beq L_0642
    L_01a7: ret 
    L_01a8: ldloc.1 
    L_01a9: ldc.i4 0xa8c
    L_01ae: beq L_0647
    L_01b3: ldloc.1 
    L_01b4: ldc.i4 0xaf0
    L_01b9: beq L_064c
    L_01be: ldloc.1 
    L_01bf: ldc.i4 0xb54
    L_01c4: beq L_0651
    L_01c9: ret 
    L_01ca: ldloc.1 
    L_01cb: ldc.i4 0xc80
    L_01d0: bgt.s L_01f4
    L_01d2: ldloc.1 
    L_01d3: ldc.i4 0xbb8
    L_01d8: beq L_0656
    L_01dd: ldloc.1 
    L_01de: ldc.i4 0xc1c
    L_01e3: beq L_065b
    L_01e8: ldloc.1 
    L_01e9: ldc.i4 0xc80
    L_01ee: beq L_0660
    L_01f3: ret 
    L_01f4: ldloc.1 
    L_01f5: ldc.i4 0xd48
    L_01fa: bgt.s L_0213
    L_01fc: ldloc.1 
    L_01fd: ldc.i4 0xce4
    L_0202: beq L_0665
    L_0207: ldloc.1 
    L_0208: ldc.i4 0xd48
    L_020d: beq L_066a
    L_0212: ret 
    L_0213: ldloc.1 
    L_0214: ldc.i4 0xdac
    L_0219: beq L_066f
    L_021e: ldloc.1 
    L_021f: ldc.i4 0xe10
    L_0224: beq L_0674
    L_0229: ret 
    L_022a: ldloc.1 
    L_022b: ldc.i4 0x1068
    L_0230: bgt.s L_027e
    L_0232: ldloc.1 
    L_0233: ldc.i4 0xf3c
    L_0238: bgt.s L_025c
    L_023a: ldloc.1 
    L_023b: ldc.i4 0xe74
    L_0240: beq L_0679
    L_0245: ldloc.1 
    L_0246: ldc.i4 0xed8
    L_024b: beq L_067e
    L_0250: ldloc.1 
    L_0251: ldc.i4 0xf3c
    L_0256: beq L_0683
    L_025b: ret 
    L_025c: ldloc.1 
    L_025d: ldc.i4 0xfa0
    L_0262: beq L_0688
    L_0267: ldloc.1 
    L_0268: ldc.i4 0x1004
    L_026d: beq L_068d
    L_0272: ldloc.1 
    L_0273: ldc.i4 0x1068
    L_0278: beq L_0692
    L_027d: ret 
    L_027e: ldloc.1 
    L_027f: ldc.i4 0x1194
    L_0284: bgt.s L_02a8
    L_0286: ldloc.1 
    L_0287: ldc.i4 0x10cc
    L_028c: beq L_0697
    L_0291: ldloc.1 
    L_0292: ldc.i4 0x1130
    L_0297: beq L_069c
    L_029c: ldloc.1 
    L_029d: ldc.i4 0x1194
    L_02a2: beq L_06a1
    L_02a7: ret 
    L_02a8: ldloc.1 
    L_02a9: ldc.i4 0x125c
    L_02ae: bgt.s L_02c7
    L_02b0: ldloc.1 
    L_02b1: ldc.i4 0x11f8
    L_02b6: beq L_06a6
    L_02bb: ldloc.1 
    L_02bc: ldc.i4 0x125c
    L_02c1: beq L_06ab
    L_02c6: ret 
    L_02c7: ldloc.1 
    L_02c8: ldc.i4 0x12c0
    L_02cd: beq L_06b0
    L_02d2: ldloc.1 
    L_02d3: ldc.i4 0x1324
    L_02d8: beq L_06b5
    L_02dd: ret 
    L_02de: ldloc.1 
    L_02df: ldc.i4 0x1ce8
    L_02e4: bgt L_0448
    L_02e9: ldloc.1 
    L_02ea: ldc.i4 0x17d4
    L_02ef: bgt L_0394
    L_02f4: ldloc.1 
    L_02f5: ldc.i4 0x157c
    L_02fa: bgt.s L_0348
    L_02fc: ldloc.1 
    L_02fd: ldc.i4 0x1450
    L_0302: bgt.s L_0326
    L_0304: ldloc.1 
    L_0305: ldc.i4 0x1388
    L_030a: beq L_06ba
    L_030f: ldloc.1 
    L_0310: ldc.i4 0x13ec
    L_0315: beq L_06bf
    L_031a: ldloc.1 
    L_031b: ldc.i4 0x1450
    L_0320: beq L_06c4
    L_0325: ret 
    L_0326: ldloc.1 
    L_0327: ldc.i4 0x14b4
    L_032c: beq L_06c9
    L_0331: ldloc.1 
    L_0332: ldc.i4 0x1518
    L_0337: beq L_06ce
    L_033c: ldloc.1 
    L_033d: ldc.i4 0x157c
    L_0342: beq L_06d3
    L_0347: ret 
    L_0348: ldloc.1 
    L_0349: ldc.i4 0x16a8
    L_034e: bgt.s L_0372
    L_0350: ldloc.1 
    L_0351: ldc.i4 0x15e0
    L_0356: beq L_06d8
    L_035b: ldloc.1 
    L_035c: ldc.i4 0x1644
    L_0361: beq L_06dd
    L_0366: ldloc.1 
    L_0367: ldc.i4 0x16a8
    L_036c: beq L_06e2
    L_0371: ret 
    L_0372: ldloc.1 
    L_0373: ldc.i4 0x170c
    L_0378: beq L_06e7
    L_037d: ldloc.1 
    L_037e: ldc.i4 0x1770
    L_0383: beq L_06ec
    L_0388: ldloc.1 
    L_0389: ldc.i4 0x17d4
    L_038e: beq L_06f1
    L_0393: ret 
    L_0394: ldloc.1 
    L_0395: ldc.i4 0x1a2c
    L_039a: bgt.s L_03e8
    L_039c: ldloc.1 
    L_039d: ldc.i4 0x1900
    L_03a2: bgt.s L_03c6
    L_03a4: ldloc.1 
    L_03a5: ldc.i4 0x1838
    L_03aa: beq L_06f6
    L_03af: ldloc.1 
    L_03b0: ldc.i4 0x189c
    L_03b5: beq L_06fb
    L_03ba: ldloc.1 
    L_03bb: ldc.i4 0x1900
    L_03c0: beq L_0700
    L_03c5: ret 
    L_03c6: ldloc.1 
    L_03c7: ldc.i4 0x1964
    L_03cc: beq L_0705
    L_03d1: ldloc.1 
    L_03d2: ldc.i4 0x19c8
    L_03d7: beq L_070a
    L_03dc: ldloc.1 
    L_03dd: ldc.i4 0x1a2c
    L_03e2: beq L_070f
    L_03e7: ret 
    L_03e8: ldloc.1 
    L_03e9: ldc.i4 0x1b58
    L_03ee: bgt.s L_0412
    L_03f0: ldloc.1 
    L_03f1: ldc.i4 0x1a90
    L_03f6: beq L_0714
    L_03fb: ldloc.1 
    L_03fc: ldc.i4 0x1af4
    L_0401: beq L_0719
    L_0406: ldloc.1 
    L_0407: ldc.i4 0x1b58
    L_040c: beq L_071e
    L_0411: ret 
    L_0412: ldloc.1 
    L_0413: ldc.i4 0x1c20
    L_0418: bgt.s L_0431
    L_041a: ldloc.1 
    L_041b: ldc.i4 0x1bbc
    L_0420: beq L_0723
    L_0425: ldloc.1 
    L_0426: ldc.i4 0x1c20
    L_042b: beq L_0728
    L_0430: ret 
    L_0431: ldloc.1 
    L_0432: ldc.i4 0x1c84
    L_0437: beq L_072d
    L_043c: ldloc.1 
    L_043d: ldc.i4 0x1ce8
    L_0442: beq L_0732
    L_0447: ret 
    L_0448: ldloc.1 
    L_0449: ldc.i4 0x21fc
    L_044e: bgt L_0507
    L_0453: ldloc.1 
    L_0454: ldc.i4 0x1f40
    L_0459: bgt.s L_04a7
    L_045b: ldloc.1 
    L_045c: ldc.i4 0x1e14
    L_0461: bgt.s L_0485
    L_0463: ldloc.1 
    L_0464: ldc.i4 0x1d4c
    L_0469: beq L_0737
    L_046e: ldloc.1 
    L_046f: ldc.i4 0x1db0
    L_0474: beq L_073c
    L_0479: ldloc.1 
    L_047a: ldc.i4 0x1e14
    L_047f: beq L_0741
    L_0484: ret 
    L_0485: ldloc.1 
    L_0486: ldc.i4 0x1e78
    L_048b: beq L_0746
    L_0490: ldloc.1 
    L_0491: ldc.i4 0x1edc
    L_0496: beq L_074b
    L_049b: ldloc.1 
    L_049c: ldc.i4 0x1f40
    L_04a1: beq L_0750
    L_04a6: ret 
    L_04a7: ldloc.1 
    L_04a8: ldc.i4 0x206c
    L_04ad: bgt.s L_04d1
    L_04af: ldloc.1 
    L_04b0: ldc.i4 0x1fa4
    L_04b5: beq L_0755
    L_04ba: ldloc.1 
    L_04bb: ldc.i4 0x2008
    L_04c0: beq L_075a
    L_04c5: ldloc.1 
    L_04c6: ldc.i4 0x206c
    L_04cb: beq L_075f
    L_04d0: ret 
    L_04d1: ldloc.1 
    L_04d2: ldc.i4 0x2134
    L_04d7: bgt.s L_04f0
    L_04d9: ldloc.1 
    L_04da: ldc.i4 0x20d0
    L_04df: beq L_0764
    L_04e4: ldloc.1 
    L_04e5: ldc.i4 0x2134
    L_04ea: beq L_0769
    L_04ef: ret 
    L_04f0: ldloc.1 
    L_04f1: ldc.i4 0x2198
    L_04f6: beq L_076e
    L_04fb: ldloc.1 
    L_04fc: ldc.i4 0x21fc
    L_0501: beq L_0773
    L_0506: ret 
    L_0507: ldloc.1 
    L_0508: ldc.i4 0x2454
    L_050d: bgt.s L_055b
    L_050f: ldloc.1 
    L_0510: ldc.i4 0x2328
    L_0515: bgt.s L_0539
    L_0517: ldloc.1 
    L_0518: ldc.i4 0x2260
    L_051d: beq L_0778
    L_0522: ldloc.1 
    L_0523: ldc.i4 0x22c4
    L_0528: beq L_077d
    L_052d: ldloc.1 
    L_052e: ldc.i4 0x2328
    L_0533: beq L_0782
    L_0538: ret 
    L_0539: ldloc.1 
    L_053a: ldc.i4 0x238c
    L_053f: beq L_0787
    L_0544: ldloc.1 
    L_0545: ldc.i4 0x23f0
    L_054a: beq L_078c
    L_054f: ldloc.1 
    L_0550: ldc.i4 0x2454
    L_0555: beq L_0791
    L_055a: ret 
    L_055b: ldloc.1 
    L_055c: ldc.i4 0x2580
    L_0561: bgt.s L_0585
    L_0563: ldloc.1 
    L_0564: ldc.i4 0x24b8
    L_0569: beq L_0796
    L_056e: ldloc.1 
    L_056f: ldc.i4 0x251c
    L_0574: beq L_079b
    L_0579: ldloc.1 
    L_057a: ldc.i4 0x2580
    L_057f: beq L_07a0
    L_0584: ret 
    L_0585: ldloc.1 
    L_0586: ldc.i4 0x2648
    L_058b: bgt.s L_05a4
    L_058d: ldloc.1 
    L_058e: ldc.i4 0x25e4
    L_0593: beq L_07a5
    L_0598: ldloc.1 
    L_0599: ldc.i4 0x2648
    L_059e: beq L_07aa
    L_05a3: ret 
    L_05a4: ldloc.1 
    L_05a5: ldc.i4 0x26ac
    L_05aa: beq L_07af
    L_05af: ldloc.1 
    L_05b0: ldc.i4 0x2710
    L_05b5: beq L_07b4
    L_05ba: ret 
    L_05bb: ldloc.0 
    L_05bc: ldc.i4.1 
    L_05bd: add 
    L_05be: stloc.0 
    L_05bf: ret 
    L_05c0: ldloc.0 
    L_05c1: ldc.i4.1 
    L_05c2: add 
    L_05c3: stloc.0 
    L_05c4: ret 
    L_05c5: ldloc.0 
    L_05c6: ldc.i4.1 
    L_05c7: add 
    L_05c8: stloc.0 
    L_05c9: ret 
    L_05ca: ldloc.0 
    L_05cb: ldc.i4.1 
    L_05cc: add 
    L_05cd: stloc.0 
    L_05ce: ret 
    L_05cf: ldloc.0 
    L_05d0: ldc.i4.1 
    L_05d1: add 
    L_05d2: stloc.0 
    L_05d3: ret 
    L_05d4: ldloc.0 
    L_05d5: ldc.i4.1 
    L_05d6: add 
    L_05d7: stloc.0 
    L_05d8: ret 
    L_05d9: ldloc.0 
    L_05da: ldc.i4.1 
    L_05db: add 
    L_05dc: stloc.0 
    L_05dd: ret 
    L_05de: ldloc.0 
    L_05df: ldc.i4.1 
    L_05e0: add 
    L_05e1: stloc.0 
    L_05e2: ret 
    L_05e3: ldloc.0 
    L_05e4: ldc.i4.1 
    L_05e5: add 
    L_05e6: stloc.0 
    L_05e7: ret 
    L_05e8: ldloc.0 
    L_05e9: ldc.i4.1 
    L_05ea: add 
    L_05eb: stloc.0 
    L_05ec: ret 
    L_05ed: ldloc.0 
    L_05ee: ldc.i4.1 
    L_05ef: add 
    L_05f0: stloc.0 
    L_05f1: ret 
    L_05f2: ldloc.0 
    L_05f3: ldc.i4.1 
    L_05f4: add 
    L_05f5: stloc.0 
    L_05f6: ret 
    L_05f7: ldloc.0 
    L_05f8: ldc.i4.1 
    L_05f9: add 
    L_05fa: stloc.0 
    L_05fb: ret 
    L_05fc: ldloc.0 
    L_05fd: ldc.i4.1 
    L_05fe: add 
    L_05ff: stloc.0 
    L_0600: ret 
    L_0601: ldloc.0 
    L_0602: ldc.i4.1 
    L_0603: add 
    L_0604: stloc.0 
    L_0605: ret 
    L_0606: ldloc.0 
    L_0607: ldc.i4.1 
    L_0608: add 
    L_0609: stloc.0 
    L_060a: ret 
    L_060b: ldloc.0 
    L_060c: ldc.i4.1 
    L_060d: add 
    L_060e: stloc.0 
    L_060f: ret 
    L_0610: ldloc.0 
    L_0611: ldc.i4.1 
    L_0612: add 
    L_0613: stloc.0 
    L_0614: ret 
    L_0615: ldloc.0 
    L_0616: ldc.i4.1 
    L_0617: add 
    L_0618: stloc.0 
    L_0619: ret 
    L_061a: ldloc.0 
    L_061b: ldc.i4.1 
    L_061c: add 
    L_061d: stloc.0 
    L_061e: ret 
    L_061f: ldloc.0 
    L_0620: ldc.i4.1 
    L_0621: add 
    L_0622: stloc.0 
    L_0623: ret 
    L_0624: ldloc.0 
    L_0625: ldc.i4.1 
    L_0626: add 
    L_0627: stloc.0 
    L_0628: ret 
    L_0629: ldloc.0 
    L_062a: ldc.i4.1 
    L_062b: add 
    L_062c: stloc.0 
    L_062d: ret 
    L_062e: ldloc.0 
    L_062f: ldc.i4.1 
    L_0630: add 
    L_0631: stloc.0 
    L_0632: ret 
    L_0633: ldloc.0 
    L_0634: ldc.i4.1 
    L_0635: add 
    L_0636: stloc.0 
    L_0637: ret 
    L_0638: ldloc.0 
    L_0639: ldc.i4.1 
    L_063a: add 
    L_063b: stloc.0 
    L_063c: ret 
    L_063d: ldloc.0 
    L_063e: ldc.i4.1 
    L_063f: add 
    L_0640: stloc.0 
    L_0641: ret 
    L_0642: ldloc.0 
    L_0643: ldc.i4.1 
    L_0644: add 
    L_0645: stloc.0 
    L_0646: ret 
    L_0647: ldloc.0 
    L_0648: ldc.i4.1 
    L_0649: add 
    L_064a: stloc.0 
    L_064b: ret 
    L_064c: ldloc.0 
    L_064d: ldc.i4.1 
    L_064e: add 
    L_064f: stloc.0 
    L_0650: ret 
    L_0651: ldloc.0 
    L_0652: ldc.i4.1 
    L_0653: add 
    L_0654: stloc.0 
    L_0655: ret 
    L_0656: ldloc.0 
    L_0657: ldc.i4.1 
    L_0658: add 
    L_0659: stloc.0 
    L_065a: ret 
    L_065b: ldloc.0 
    L_065c: ldc.i4.1 
    L_065d: add 
    L_065e: stloc.0 
    L_065f: ret 
    L_0660: ldloc.0 
    L_0661: ldc.i4.1 
    L_0662: add 
    L_0663: stloc.0 
    L_0664: ret 
    L_0665: ldloc.0 
    L_0666: ldc.i4.1 
    L_0667: add 
    L_0668: stloc.0 
    L_0669: ret 
    L_066a: ldloc.0 
    L_066b: ldc.i4.1 
    L_066c: add 
    L_066d: stloc.0 
    L_066e: ret 
    L_066f: ldloc.0 
    L_0670: ldc.i4.1 
    L_0671: add 
    L_0672: stloc.0 
    L_0673: ret 
    L_0674: ldloc.0 
    L_0675: ldc.i4.1 
    L_0676: add 
    L_0677: stloc.0 
    L_0678: ret 
    L_0679: ldloc.0 
    L_067a: ldc.i4.1 
    L_067b: add 
    L_067c: stloc.0 
    L_067d: ret 
    L_067e: ldloc.0 
    L_067f: ldc.i4.1 
    L_0680: add 
    L_0681: stloc.0 
    L_0682: ret 
    L_0683: ldloc.0 
    L_0684: ldc.i4.1 
    L_0685: add 
    L_0686: stloc.0 
    L_0687: ret 
    L_0688: ldloc.0 
    L_0689: ldc.i4.1 
    L_068a: add 
    L_068b: stloc.0 
    L_068c: ret 
    L_068d: ldloc.0 
    L_068e: ldc.i4.1 
    L_068f: add 
    L_0690: stloc.0 
    L_0691: ret 
    L_0692: ldloc.0 
    L_0693: ldc.i4.1 
    L_0694: add 
    L_0695: stloc.0 
    L_0696: ret 
    L_0697: ldloc.0 
    L_0698: ldc.i4.1 
    L_0699: add 
    L_069a: stloc.0 
    L_069b: ret 
    L_069c: ldloc.0 
    L_069d: ldc.i4.1 
    L_069e: add 
    L_069f: stloc.0 
    L_06a0: ret 
    L_06a1: ldloc.0 
    L_06a2: ldc.i4.1 
    L_06a3: add 
    L_06a4: stloc.0 
    L_06a5: ret 
    L_06a6: ldloc.0 
    L_06a7: ldc.i4.1 
    L_06a8: add 
    L_06a9: stloc.0 
    L_06aa: ret 
    L_06ab: ldloc.0 
    L_06ac: ldc.i4.1 
    L_06ad: add 
    L_06ae: stloc.0 
    L_06af: ret 
    L_06b0: ldloc.0 
    L_06b1: ldc.i4.1 
    L_06b2: add 
    L_06b3: stloc.0 
    L_06b4: ret 
    L_06b5: ldloc.0 
    L_06b6: ldc.i4.1 
    L_06b7: add 
    L_06b8: stloc.0 
    L_06b9: ret 
    L_06ba: ldloc.0 
    L_06bb: ldc.i4.1 
    L_06bc: add 
    L_06bd: stloc.0 
    L_06be: ret 
    L_06bf: ldloc.0 
    L_06c0: ldc.i4.1 
    L_06c1: add 
    L_06c2: stloc.0 
    L_06c3: ret 
    L_06c4: ldloc.0 
    L_06c5: ldc.i4.1 
    L_06c6: add 
    L_06c7: stloc.0 
    L_06c8: ret 
    L_06c9: ldloc.0 
    L_06ca: ldc.i4.1 
    L_06cb: add 
    L_06cc: stloc.0 
    L_06cd: ret 
    L_06ce: ldloc.0 
    L_06cf: ldc.i4.1 
    L_06d0: add 
    L_06d1: stloc.0 
    L_06d2: ret 
    L_06d3: ldloc.0 
    L_06d4: ldc.i4.1 
    L_06d5: add 
    L_06d6: stloc.0 
    L_06d7: ret 
    L_06d8: ldloc.0 
    L_06d9: ldc.i4.1 
    L_06da: add 
    L_06db: stloc.0 
    L_06dc: ret 
    L_06dd: ldloc.0 
    L_06de: ldc.i4.1 
    L_06df: add 
    L_06e0: stloc.0 
    L_06e1: ret 
    L_06e2: ldloc.0 
    L_06e3: ldc.i4.1 
    L_06e4: add 
    L_06e5: stloc.0 
    L_06e6: ret 
    L_06e7: ldloc.0 
    L_06e8: ldc.i4.1 
    L_06e9: add 
    L_06ea: stloc.0 
    L_06eb: ret 
    L_06ec: ldloc.0 
    L_06ed: ldc.i4.1 
    L_06ee: add 
    L_06ef: stloc.0 
    L_06f0: ret 
    L_06f1: ldloc.0 
    L_06f2: ldc.i4.1 
    L_06f3: add 
    L_06f4: stloc.0 
    L_06f5: ret 
    L_06f6: ldloc.0 
    L_06f7: ldc.i4.1 
    L_06f8: add 
    L_06f9: stloc.0 
    L_06fa: ret 
    L_06fb: ldloc.0 
    L_06fc: ldc.i4.1 
    L_06fd: add 
    L_06fe: stloc.0 
    L_06ff: ret 
    L_0700: ldloc.0 
    L_0701: ldc.i4.1 
    L_0702: add 
    L_0703: stloc.0 
    L_0704: ret 
    L_0705: ldloc.0 
    L_0706: ldc.i4.1 
    L_0707: add 
    L_0708: stloc.0 
    L_0709: ret 
    L_070a: ldloc.0 
    L_070b: ldc.i4.1 
    L_070c: add 
    L_070d: stloc.0 
    L_070e: ret 
    L_070f: ldloc.0 
    L_0710: ldc.i4.1 
    L_0711: add 
    L_0712: stloc.0 
    L_0713: ret 
    L_0714: ldloc.0 
    L_0715: ldc.i4.1 
    L_0716: add 
    L_0717: stloc.0 
    L_0718: ret 
    L_0719: ldloc.0 
    L_071a: ldc.i4.1 
    L_071b: add 
    L_071c: stloc.0 
    L_071d: ret 
    L_071e: ldloc.0 
    L_071f: ldc.i4.1 
    L_0720: add 
    L_0721: stloc.0 
    L_0722: ret 
    L_0723: ldloc.0 
    L_0724: ldc.i4.1 
    L_0725: add 
    L_0726: stloc.0 
    L_0727: ret 
    L_0728: ldloc.0 
    L_0729: ldc.i4.1 
    L_072a: add 
    L_072b: stloc.0 
    L_072c: ret 
    L_072d: ldloc.0 
    L_072e: ldc.i4.1 
    L_072f: add 
    L_0730: stloc.0 
    L_0731: ret 
    L_0732: ldloc.0 
    L_0733: ldc.i4.1 
    L_0734: add 
    L_0735: stloc.0 
    L_0736: ret 
    L_0737: ldloc.0 
    L_0738: ldc.i4.1 
    L_0739: add 
    L_073a: stloc.0 
    L_073b: ret 
    L_073c: ldloc.0 
    L_073d: ldc.i4.1 
    L_073e: add 
    L_073f: stloc.0 
    L_0740: ret 
    L_0741: ldloc.0 
    L_0742: ldc.i4.1 
    L_0743: add 
    L_0744: stloc.0 
    L_0745: ret 
    L_0746: ldloc.0 
    L_0747: ldc.i4.1 
    L_0748: add 
    L_0749: stloc.0 
    L_074a: ret 
    L_074b: ldloc.0 
    L_074c: ldc.i4.1 
    L_074d: add 
    L_074e: stloc.0 
    L_074f: ret 
    L_0750: ldloc.0 
    L_0751: ldc.i4.1 
    L_0752: add 
    L_0753: stloc.0 
    L_0754: ret 
    L_0755: ldloc.0 
    L_0756: ldc.i4.1 
    L_0757: add 
    L_0758: stloc.0 
    L_0759: ret 
    L_075a: ldloc.0 
    L_075b: ldc.i4.1 
    L_075c: add 
    L_075d: stloc.0 
    L_075e: ret 
    L_075f: ldloc.0 
    L_0760: ldc.i4.1 
    L_0761: add 
    L_0762: stloc.0 
    L_0763: ret 
    L_0764: ldloc.0 
    L_0765: ldc.i4.1 
    L_0766: add 
    L_0767: stloc.0 
    L_0768: ret 
    L_0769: ldloc.0 
    L_076a: ldc.i4.1 
    L_076b: add 
    L_076c: stloc.0 
    L_076d: ret 
    L_076e: ldloc.0 
    L_076f: ldc.i4.1 
    L_0770: add 
    L_0771: stloc.0 
    L_0772: ret 
    L_0773: ldloc.0 
    L_0774: ldc.i4.1 
    L_0775: add 
    L_0776: stloc.0 
    L_0777: ret 
    L_0778: ldloc.0 
    L_0779: ldc.i4.1 
    L_077a: add 
    L_077b: stloc.0 
    L_077c: ret 
    L_077d: ldloc.0 
    L_077e: ldc.i4.1 
    L_077f: add 
    L_0780: stloc.0 
    L_0781: ret 
    L_0782: ldloc.0 
    L_0783: ldc.i4.1 
    L_0784: add 
    L_0785: stloc.0 
    L_0786: ret 
    L_0787: ldloc.0 
    L_0788: ldc.i4.1 
    L_0789: add 
    L_078a: stloc.0 
    L_078b: ret 
    L_078c: ldloc.0 
    L_078d: ldc.i4.1 
    L_078e: add 
    L_078f: stloc.0 
    L_0790: ret 
    L_0791: ldloc.0 
    L_0792: ldc.i4.1 
    L_0793: add 
    L_0794: stloc.0 
    L_0795: ret 
    L_0796: ldloc.0 
    L_0797: ldc.i4.1 
    L_0798: add 
    L_0799: stloc.0 
    L_079a: ret 
    L_079b: ldloc.0 
    L_079c: ldc.i4.1 
    L_079d: add 
    L_079e: stloc.0 
    L_079f: ret 
    L_07a0: ldloc.0 
    L_07a1: ldc.i4.1 
    L_07a2: add 
    L_07a3: stloc.0 
    L_07a4: ret 
    L_07a5: ldloc.0 
    L_07a6: ldc.i4.1 
    L_07a7: add 
    L_07a8: stloc.0 
    L_07a9: ret 
    L_07aa: ldloc.0 
    L_07ab: ldc.i4.1 
    L_07ac: add 
    L_07ad: stloc.0 
    L_07ae: ret 
    L_07af: ldloc.0 
    L_07b0: ldc.i4.1 
    L_07b1: add 
    L_07b2: stloc.0 
    L_07b3: ret 
    L_07b4: ldloc.0 
    L_07b5: ldc.i4.1 
    L_07b6: add 
    L_07b7: stloc.0 
    L_07b8: ret 
}
Re[19]: CIL switch и сопоставление с образцом
От: Воронков Василий Россия  
Дата: 15.09.10 07:53
Оценка:
Здравствуйте, hardcase, Вы писали:

ВВ>>1. Ввести опцию компилятора forceSwitch, при которой джамп-таблица генерируется для любого кол-ва вхождений

ВВ>>2. Добавить специальное ключевое слово, атрибут, whatever с теми же целями.
H>Я повторюсь, но это несколько бессмысленно для матчинга по вариантам... Ну не дает оно прироста на 10 вхождениях.

Я про целые.

ВВ>>Чем не нравится вариант с ограничением:

ВВ>>Кстати, пропуски при построении свитча по целым учитываются?
H>Алгоритм закрывает до двух пропусков в матче, как по числам так и по вариантам.

А почему именно два? Какое кол-во пропускает допускает Шарп?
Re[20]: CIL switch и сопоставление с образцом
От: Воронков Василий Россия  
Дата: 15.09.10 08:18
Оценка:
Здравствуйте, hardcase, Вы писали:

А для

0
4
5
6

7
..

уже свитча не будет?
Тот же Шарп будет генерировать свитч даже если в первом случае пропуск хоть 1000, может разбить конструкцию на несколько свитчей, использовать комбинацию свитчей, бинарного поиска и пр.

Я к чему — реализация свитча задача весьма ответственная. Особенно в Немерле, весь код на котором — это сплошной матч. Получается, ты делаешь очень серьезное корневое изменение в компиляторе и все ограничения и логику лучше не брать с потолка. В итоге может оказаться, что компилятор сам себя собирает хорошо, а вот люди, скачавшие последнюю версию Немерла, обнаружат, что производительность упала. Свитч — штука специфическая, может помочь, а может и навредить.

В итоге — стоит ли игра свеч? А именно — реализация, при которой компилятор сам решает, когда ему использовать свитч? Свитч — средство оптимизации, так почему бы ему не остаться таковым? ИМХО идеальным вариантом было бы сделать специальный атрибут UseCilSwitch, который можно приставить к матчу — и тогда, и только тогда, компиляция будет происходить в свитч. Это сохранит обратную совместимость, упростит задачу по разработке и Свитч в общем будет тем, чем он на самом деле является — средством оптимизации.
Re[21]: CIL switch и сопоставление с образцом
От: hardcase Пират http://nemerle.org
Дата: 15.09.10 08:38
Оценка:
Здравствуйте, Воронков Василий, Вы писали:


ВВ>уже свитча не будет?

ВВ>Тот же Шарп будет генерировать свитч даже если в первом случае пропуск хоть 1000, может разбить конструкцию на несколько свитчей, использовать комбинацию свитчей, бинарного поиска и пр.

Скачай исходники, собери компилятор и посмотри — я верю, ты сможешь.
Тема для того и создавалась.
ncc делает кое что из этого, за исключением двоичного поиска, реализовать который не такая уж и простая задача.


ВВ>В итоге — стоит ли игра свеч? А именно — реализация, при которой компилятор сам решает, когда ему использовать свитч? Свитч — средство оптимизации, так почему бы ему не остаться таковым? ИМХО идеальным вариантом было бы сделать специальный атрибут UseCilSwitch, который можно приставить к матчу — и тогда, и только тогда, компиляция будет происходить в свитч.


ВВ>Это сохранит обратную совместимость,

А она терялась?

ВВ>упростит задачу по разработке

Нисколько не упростит, а даже усложнит.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[14]: CIL switch и сопоставление с образцом
От: hardcase Пират http://nemerle.org
Дата: 15.09.10 08:48
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Здравствуйте, hardcase, Вы писали:


H>>Здравствуйте, Ka3a4oK, Вы писали:


KK>>>1. небольшие дыры -> таблица с константным временем

KK>>>2. большие дыры -> бинарный поиск(или может даже хэш-таблица при большом количестве элементов)


H>>Что-то я сомневаюсь в том, что C# компилятор производит оптимизацию №2.

H>>На каком количестве разреженных вхождений бинарный поиск будет в среднем быстрее линейного?


ВВ>
ВВ>using System;
ВВ>using System.Collections.Generic;
ВВ>using System.Linq;
ВВ>using System.Text;

ВВ>namespace ConsoleApplication2
ВВ>{
ВВ>    class Program
ВВ>    {
ВВ>        static void Main(string[] args)
ВВ>        {
ВВ>            var x = 5;

ВВ>            switch (x)
ВВ>            {
ВВ>........
ВВ>            }
ВВ>        }
ВВ>    }
ВВ>}
ВВ>


Но это при условии, что логика case-ов исключительно тривиальна.
И если данная конструкция действительно будет востребована, реализовать бинарный поиск я смогу, но сейчас этот пример слишком абстрактен.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[21]: CIL switch и сопоставление с образцом
От: hardcase Пират http://nemerle.org
Дата: 15.09.10 08:50
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>В итоге — стоит ли игра свеч? А именно — реализация, при которой компилятор сам решает, когда ему использовать свитч?


Т.е. свич уже не нужен?
/* иЗвиНите зА неРовнЫй поЧерК */
Re[21]: CIL switch и сопоставление с образцом
От: hardcase Пират http://nemerle.org
Дата: 15.09.10 08:54
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>В итоге — стоит ли игра свеч? А именно — реализация, при которой компилятор сам решает, когда ему использовать свитч? Свитч — средство оптимизации, так почему бы ему не остаться таковым?


Являясь средством оптимизации он применяется компилятором только тогда, когда его применение оправдано. Управлять "оправданностью" можно с помощью параметров -Oswv и -Oswo.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[15]: CIL switch и сопоставление с образцом
От: Ka3a4oK  
Дата: 15.09.10 09:06
Оценка:
H>Но это при условии, что логика case-ов исключительно тривиальна.
H>И если данная конструкция действительно будет востребована, реализовать бинарный поиск я смогу, но сейчас этот пример слишком абстрактен.

А в чем проблема реализации при нетривиальной логике? И что является мерой тривиальности?
Re[16]: CIL switch и сопоставление с образцом
От: hardcase Пират http://nemerle.org
Дата: 15.09.10 09:29
Оценка: +1
Здравствуйте, Ka3a4oK, Вы писали:

H>>Но это при условии, что логика case-ов исключительно тривиальна.

H>>И если данная конструкция действительно будет востребована, реализовать бинарный поиск я смогу, но сейчас этот пример слишком абстрактен.

KK>А в чем проблема реализации при нетривиальной логике? И что является мерой тривиальности?


Баланс времени выбора и времени исполнения блока.
Если блок складывает два числа, то да, время выбора действия будет превалировать, если же блок вызывает пару-тройку виртуальных функций, то время выбора становится все менее значимым — зачем оптимизировать то, что практически никак не сказывается на производительности?
/* иЗвиНите зА неРовнЫй поЧерК */
Re[10]: CIL switch и сопоставление с образцом
От: VladD2 Российская Империя www.nemerle.org
Дата: 15.09.10 15:02
Оценка:
Здравствуйте, Ka3a4oK, Вы писали:

KK>Т.е. я правильно ли понимаю, что данное усовершенствование (применение инстуркции switch для патерн матчинга) будет работать только при патерн-матчинге интегральных типов, при этом множество выбора должно быть "без пропусков"?


Нет, не правильно. Пропуски возможны, так как хардкейс реализовал забивку небольшого числа пропусков переходами на default-обработчик.

Кроме того switch генерируется и для вариантов. При этом у базового типа (самого варианта) вызывается виртуальный метод возвращающий целочисленный идентификатор. Кроме того делается проверка на null. Именно эти телодвижения приводят к тому, что паттерн-матчинг по вариантам незначительно замедлился. И именно для этого случая хардкейс ввел константу (12) минимального идущего подряд числа значений.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[12]: CIL switch и сопоставление с образцом
От: VladD2 Российская Империя www.nemerle.org
Дата: 15.09.10 15:05
Оценка:
Здравствуйте, Ka3a4oK, Вы писали:

KK>2. большие дыры -> бинарный поиск(или может даже хэш-таблица при большом количестве элементов)


Хэш-таблица для целых — это очень не эффективное решение.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[13]: CIL switch и сопоставление с образцом
От: VladD2 Российская Империя www.nemerle.org
Дата: 15.09.10 15:06
Оценка:
Здравствуйте, hardcase, Вы писали:

H>На каком количестве разреженных вхождений бинарный поиск будет в среднем быстрее линейного?


Теоретически при количестве элементов большем чем 4. На практике, думаю, разницу можно будет заметить только на 30, а то и на 100 элементах.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[16]: CIL switch и сопоставление с образцом
От: VladD2 Российская Империя www.nemerle.org
Дата: 15.09.10 15:10
Оценка:
Здравствуйте, Ka3a4oK, Вы писали:

KK>А в чем проблема реализации при нетривиальной логике? И что является мерой тривиальности?


Проблема реализации — время на ее реализацию и тестирование.

Хардкейс же говорит о том, что овчинка скорее всего не будет стоить выделки. Бинарный поиск не даст сущетвенного выигрыша по сравнению с линейным просто потому, что на небольшом количестве элементов (что является самым частым случаем) разница не будет заметна в микроскоп, а на фоне вычислений внутри самих обработчиков ее вообще заметно не будет.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[17]: CIL switch и сопоставление с образцом
От: VladD2 Российская Империя www.nemerle.org
Дата: 15.09.10 15:12
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Баланс времени выбора и времени исполнения блока.

H>Если блок складывает два числа, то да, время выбора действия будет превалировать, если же блок вызывает пару-тройку виртуальных функций, то время выбора становится все менее значимым — зачем оптимизировать то, что практически никак не сказывается на производительности?

К сожалению тут без тестов ничего сказать нельзя. Мое предположение — разница будет не значительна, но может оказаться более значимой на программах с автогенерируемыми матчами (опять же в качестве примера возьмем генераторы ДКА).
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[12]: CIL switch и сопоставление с образцом
От: VladD2 Российская Империя www.nemerle.org
Дата: 15.09.10 15:17
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Мне непонятно, зачем вообще нужно какое-то ограничение на кол-во вхождение в свитче.


Тебе просто поспорить хочется. Тебе же русским языком сказали. Провели эксперименты которые выявили, что для вариантов данная оптимизация начинает что-то давать только с 12 элементов в свитче.

Какие еще у тебя вопросы тут возникают?

ВВ>>>Вызывается всегда один и тот же case 3. Выборка идет не по переменной цикла, а по переменной х.

VD>>А где гарантия, что код метода не заинлайнен, и что все свитч не выкинут к чертям?

ВВ>Какой метод? Методы со свитчами не инлайнятся.


Метод возвращающий константу точно заинлайнится. Далее спокойно можно выкинуть весь свичь. Кроме того тут будет работать предсказание переходов процессора (которое не сработает в случае случайного индекса).

Короче — это очередная синтетика на которую я даже смотреть не хочу. К рассмотрению принимаются только осмысленные алгоритмы или полноценные приложения. А то что синтетика ровным счтетом ничего не показывает я понял еще десять лет тому назад.

Подумай сам. Глупо ведь на основании синтетических тестов вводить оптимизации которые замедляют реальные приложения?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[20]: CIL switch и сопоставление с образцом
От: VladD2 Российская Империя www.nemerle.org
Дата: 15.09.10 15:22
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Здравствуйте, VladD2, Вы писали:


VD>>Проверяй.


ВВ>Вот тут за меня, оказывается, уже проверили:

ВВ>http://stackoverflow.com/questions/44905/c-switch-statement-limitations-why#48060

И? Какого-то невероятного роста затрат я не вижу. Ежу понятно, что чем больше кода, тем дольше он выполняется. Тупое чтение одной ячейки кэша против чтения нескольких ее линеек, а то и переход на чтение памяти. К тому же кода нет, так что вообще не ясно что обсуждается.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[20]: CIL switch и сопоставление с образцом
От: VladD2 Российская Империя www.nemerle.org
Дата: 15.09.10 15:23
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Вот тут за меня, оказывается, уже проверили:

ВВ>http://stackoverflow.com/questions/44905/c-switch-statement-limitations-why#48060

Кстати, хотелось бы узнать с чего ты посчитал результаты этих тестов не константными.

Сдается мне ты не верно понимаешь термин константное время доступа.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[20]: CIL switch и сопоставление с образцом
От: VladD2 Российская Империя www.nemerle.org
Дата: 15.09.10 15:27
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Вот тут за меня, оказывается, уже проверили:

ВВ>http://stackoverflow.com/questions/44905/c-switch-statement-limitations-why#48060

Кстати, для особо упертых цитата из твоей ссылки:

In some cases the compiler will use a CIL switch statement which is indeed a constant time branch using a jump table. However, in sparse cases as pointed out by Ivan Hamilton the compiler may generate something else entirely.

Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[18]: CIL switch и сопоставление с образцом
От: VladD2 Российская Империя www.nemerle.org
Дата: 15.09.10 15:45
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

VD>>Времени компиляции компилятором своих исходников. Т.е. если в буте бинарники со свитчами, то компиляция одного и того же кода проходит медленнее.


ВВ>Кстати, здесь может играть роль тот фактор, что ДЖИТ не инлайнит методы, в которых есть оп-код Switch.


Может. Хотя вроде как начиная с 3.5 это не так.

А может быть еще 1000 причин среди которых работа кэша и т.п. Заниматься серьезным анализом (граничащим с кандидатским дисером по сложности) я не намерен. Если у тебя есть лишнее время, то валяй, разберись и выдай народу точные выкладки. Но не надо делать далеко идущих выводов на основании синтетических тестов.

ВВ>Ну и само собой для небольших кейсов Switch может попортить работу предсказателю.


И это тоже возможно.

ВВ> Наконец у вас есть дополнительных cost для свитчей по вариантам — проверка на нуль (ты сам говорил) и вызов виртуального метода, который возвращает код вхождения (?). Для целых эти накладные расходы отсутствуют.


Совершенно верно. Потому хардкейс и разделил константы для свитча по интам и свтича по вариантам.

ВВ>Как обычно я забыл, что в Немерле *все* условные конструции — это матч. И сие, конечно, вносит свои коррективы.


Ага. Наконец то ты стал понимать, что есть куча разных "но" о которых мы иной раз даже не догадываемся.

ВВ>Тут возможно два варианта:


ВВ>1. Ввести опцию компилятора forceSwitch, при которой джамп-таблица генерируется для любого кол-ва вхождений

ВВ>2. Добавить специальное ключевое слово, атрибут, whatever с теми же целями.

Ключевое слово — это уже перебор, на мой взгляд. Вот ввести опцию компилятора позволяющую задать минимальное число подряд идущих индексов для которых генерируется свитч — это можно и не сложно. Даже можно добавить две таких опции. Одну для целых и перечислений, а вторую для вариантов.

ВВ>Чем не нравится вариант с ограничением:


ВВ>Спорить, надеюсь, не будешь, что в ряде случаев использование джамп-таблицы вместо цепочки переходов может очень сильно влиять на производительности?


Буду. "Очень сильно" — это преувеличение. В любом случае это будут проценты. Скорее всего даже не десятки.

Тут еще нужно понимать, что немерл — это не язык для людей типа Дворкина которые пытаются выжать биты из любого байта. Немерл — это высокоуровневый язык обеспечивающий приемлемую производительность для большинства задач (сравнимую с шаропом, но не обязательно равную ему). Люди пишущие на немреле скорее всего предпочтут циклу вызов функции высшего порядка. А это уже оврехэд. Другими словами люди пишущие немреле предпочтут небольшой оверхэд, если при этом код окажется проще и короче.

Отсюда забивать голову тонкими деталями политически не верно. Мы должны обеспечить хорошую производительность в общем. Подобранные тестовым путем константы решают эту задачу.

При это, конечно, наличие опций компилятора позволяющих изменить значения по умолчанию вряд ли кому-то помешают, а значит вполне приемлемы. Но вот введение специальных операторов — это полнейший перебор. Если кому-то там нужна числодробильная производительность, то лучше выбрать С++, или написать на нем критический к времени выполнения код.

ВВ>В итоге получается ситуация — добавил/убрал лишний кейс, и полностью поменялся генерируемый код — а вместе с ним кардинально изменилась и скорость работы. Мне кажется, это не есть гуд.


Не будет никакого координационного изменения. Будет незначительное изменение.

ВВ>Кстати, пропуски при построении свитча по целым учитываются?


Учитываются. До трех, если не ошибаюсь.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: CIL switch и сопоставление с образцом
От: VladD2 Российская Империя www.nemerle.org
Дата: 15.09.10 15:46
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Также в MSBuild-тасках теперь есть возможность указывать параметры командной строки с помощью тега <CustomArguments>,

H>например:
H>
H><CustomArguments>
H>-Oswv:15 -Oswo:3
H></CustomArguments>
H>


Надо для этого дела и в интеграциях сделать поле специальное!
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.