Note: Please refresh the page if you hit the first button as first example resets all div IDs to '', making smoke of the other examples.

Subsequent request for the first and second test will be cached. Refresh to clear the cache and see result timing while filling the cache.

The demo initially creates and attaches 1000 divs to the body of the document, both ids and classes are set to "test" for all the divs.

I found this demo on Alex Russell site and I remembered I had one of these getElementsById laying arround, so here it is...
This was NOT made to replace the standard DOM getElementById, but to extend getElement queries to classes and selectors.
Many thanks to Alex and his article for pushing me to pull this out from the forgotten...

UPDATED 2006/12/07: Safari is working now... ;-)
UPDATED 2006/12/11: using '*' character instead of '_' which may be part of ids or classnames and lead to conflicts.

/*
 * ElementsById
 *
 * Author: Diego Perini
 * Updated: 07/12/2006
 * Version: 0.0 (from parent)
 *
 * Extracted from latest IPORT/STYLER engines.
 *
 * Returns an array of elements with specified ID.
 */
function ElementsById($id) {
    var c = 0, i = 0, j = 0, k = 0;
    var nodes=[], storage = arguments.callee.storage;
    var elements = document.getElementsByTagName('*'), len = elements.length;

    if (storage &&
        storage.nodes &&
        storage.length == length &&
        storage.first == elements[0] &&
        storage.last == elements[length-1]) {
        k = $id;
        while (storage.nodes[k]) {
            nodes[nodes.length] = storage.nodes[k];
            k = $id + '*' + (++i);
        }
    } else {
        storage = { };
        storage.nodes = { };
        storage.length = 0;
        storage.first = elements[0];
        storage.last = elements[length - 1];
        while (length > i) {
            c = elements[i];
            if ((k = c.id) == $id) {
                nodes[nodes.length] = c;
                if (storage.nodes[k]) {
                   k = c.id + '*' + (++j);
                }
            }
            i++;
            storage.nodes[k] = c;
            storage.length++;
        }
        arguments.callee.storage = storage;
    }
    return nodes;
}

Should work on any browser, but I haven't tested them all, the performance gain is big, try it yourself, and comment back on the forums.

I really hope this can be used to boost performance in those new nifty libraries (getElementsByClass, getElementsBySelector etc...)

These are the browsers/platforms where I could test or get reports up to now:

As for everything here, please take this as an experiment. It has not been tested out of this simple demo and may have BUGS.

Just a side note on using document.all as I see it mentioned on Alex Blog:

and/or:

in Firefox they will ONLY be available if the document is not an XHTML document (depend on the DOCTYPE).
Their usage is deprecated in favor of getElementById and it will produce a "warning" in Firefox Javascript Console.
(You must have Webdeveloper extension and Strict Warnings turned on in the extension options to see these warns).

TODO

With time I will probably do some test by placing an extra check to see if the DOM nodes have changed.
Checking first/last element of stored cache against those returned by getElementsByTagName will yeld better refresh triggers.

test0
test1
test2
test3
test4
test5
test6
test7
test8
test9
test10
test11
test12
test13
test14
test15
test16
test17
test18
test19
test20
test21
test22
test23
test24
test25
test26
test27
test28
test29
test30
test31
test32
test33
test34
test35
test36
test37
test38
test39
test40
test41
test42
test43
test44
test45
test46
test47
test48
test49
test50
test51
test52
test53
test54
test55
test56
test57
test58
test59
test60
test61
test62
test63
test64
test65
test66
test67
test68
test69
test70
test71
test72
test73
test74
test75
test76
test77
test78
test79
test80
test81
test82
test83
test84
test85
test86
test87
test88
test89
test90
test91
test92
test93
test94
test95
test96
test97
test98
test99
test100
test101
test102
test103
test104
test105
test106
test107
test108
test109
test110
test111
test112
test113
test114
test115
test116
test117
test118
test119
test120
test121
test122
test123
test124
test125
test126
test127
test128
test129
test130
test131
test132
test133
test134
test135
test136
test137
test138
test139
test140
test141
test142
test143
test144
test145
test146
test147
test148
test149
test150
test151
test152
test153
test154
test155
test156
test157
test158
test159
test160
test161
test162
test163
test164
test165
test166
test167
test168
test169
test170
test171
test172
test173
test174
test175
test176
test177
test178
test179
test180
test181
test182
test183
test184
test185
test186
test187
test188
test189
test190
test191
test192
test193
test194
test195
test196
test197
test198
test199
test200
test201
test202
test203
test204
test205
test206
test207
test208
test209
test210
test211
test212
test213
test214
test215
test216
test217
test218
test219
test220
test221
test222
test223
test224
test225
test226
test227
test228
test229
test230
test231
test232
test233
test234
test235
test236
test237
test238
test239
test240
test241
test242
test243
test244
test245
test246
test247
test248
test249
test250
test251
test252
test253
test254
test255
test256
test257
test258
test259
test260
test261
test262
test263
test264
test265
test266
test267
test268
test269
test270
test271
test272
test273
test274
test275
test276
test277
test278
test279
test280
test281
test282
test283
test284
test285
test286
test287
test288
test289
test290
test291
test292
test293
test294
test295
test296
test297
test298
test299
test300
test301
test302
test303
test304
test305
test306
test307
test308
test309
test310
test311
test312
test313
test314
test315
test316
test317
test318
test319
test320
test321
test322
test323
test324
test325
test326
test327
test328
test329
test330
test331
test332
test333
test334
test335
test336
test337
test338
test339
test340
test341
test342
test343
test344
test345
test346
test347
test348
test349
test350
test351
test352
test353
test354
test355
test356
test357
test358
test359
test360
test361
test362
test363
test364
test365
test366
test367
test368
test369
test370
test371
test372
test373
test374
test375
test376
test377
test378
test379
test380
test381
test382
test383
test384
test385
test386
test387
test388
test389
test390
test391
test392
test393
test394
test395
test396
test397
test398
test399
test400
test401
test402
test403
test404
test405
test406
test407
test408
test409
test410
test411
test412
test413
test414
test415
test416
test417
test418
test419
test420
test421
test422
test423
test424
test425
test426
test427
test428
test429
test430
test431
test432
test433
test434
test435
test436
test437
test438
test439
test440
test441
test442
test443
test444
test445
test446
test447
test448
test449
test450
test451
test452
test453
test454
test455
test456
test457
test458
test459
test460
test461
test462
test463
test464
test465
test466
test467
test468
test469
test470
test471
test472
test473
test474
test475
test476
test477
test478
test479
test480
test481
test482
test483
test484
test485
test486
test487
test488
test489
test490
test491
test492
test493
test494
test495
test496
test497
test498
test499
test500
test501
test502
test503
test504
test505
test506
test507
test508
test509
test510
test511
test512
test513
test514
test515
test516
test517
test518
test519
test520
test521
test522
test523
test524
test525
test526
test527
test528
test529
test530
test531
test532
test533
test534
test535
test536
test537
test538
test539
test540
test541
test542
test543
test544
test545
test546
test547
test548
test549
test550
test551
test552
test553
test554
test555
test556
test557
test558
test559
test560
test561
test562
test563
test564
test565
test566
test567
test568
test569
test570
test571
test572
test573
test574
test575
test576
test577
test578
test579
test580
test581
test582
test583
test584
test585
test586
test587
test588
test589
test590
test591
test592
test593
test594
test595
test596
test597
test598
test599
test600
test601
test602
test603
test604
test605
test606
test607
test608
test609
test610
test611
test612
test613
test614
test615
test616
test617
test618
test619
test620
test621
test622
test623
test624
test625
test626
test627
test628
test629
test630
test631
test632
test633
test634
test635
test636
test637
test638
test639
test640
test641
test642
test643
test644
test645
test646
test647
test648
test649
test650
test651
test652
test653
test654
test655
test656
test657
test658
test659
test660
test661
test662
test663
test664
test665
test666
test667
test668
test669
test670
test671
test672
test673
test674
test675
test676
test677
test678
test679
test680
test681
test682
test683
test684
test685
test686
test687
test688
test689
test690
test691
test692
test693
test694
test695
test696
test697
test698
test699
test700
test701
test702
test703
test704
test705
test706
test707
test708
test709
test710
test711
test712
test713
test714
test715
test716
test717
test718
test719
test720
test721
test722
test723
test724
test725
test726
test727
test728
test729
test730
test731
test732
test733
test734
test735
test736
test737
test738
test739
test740
test741
test742
test743
test744
test745
test746
test747
test748
test749
test750
test751
test752
test753
test754
test755
test756
test757
test758
test759
test760
test761
test762
test763
test764
test765
test766
test767
test768
test769
test770
test771
test772
test773
test774
test775
test776
test777
test778
test779
test780
test781
test782
test783
test784
test785
test786
test787
test788
test789
test790
test791
test792
test793
test794
test795
test796
test797
test798
test799
test800
test801
test802
test803
test804
test805
test806
test807
test808
test809
test810
test811
test812
test813
test814
test815
test816
test817
test818
test819
test820
test821
test822
test823
test824
test825
test826
test827
test828
test829
test830
test831
test832
test833
test834
test835
test836
test837
test838
test839
test840
test841
test842
test843
test844
test845
test846
test847
test848
test849
test850
test851
test852
test853
test854
test855
test856
test857
test858
test859
test860
test861
test862
test863
test864
test865
test866
test867
test868
test869
test870
test871
test872
test873
test874
test875
test876
test877
test878
test879
test880
test881
test882
test883
test884
test885
test886
test887
test888
test889
test890
test891
test892
test893
test894
test895
test896
test897
test898
test899
test900
test901
test902
test903
test904
test905
test906
test907
test908
test909
test910
test911
test912
test913
test914
test915
test916
test917
test918
test919
test920
test921
test922
test923
test924
test925
test926
test927
test928
test929
test930
test931
test932
test933
test934
test935
test936
test937
test938
test939
test940
test941
test942
test943
test944
test945
test946
test947
test948
test949
test950
test951
test952
test953
test954
test955
test956
test957
test958
test959
test960
test961
test962
test963
test964
test965
test966
test967
test968
test969
test970
test971
test972
test973
test974
test975
test976
test977
test978
test979
test980
test981
test982
test983
test984
test985
test986
test987
test988
test989
test990
test991
test992
test993
test994
test995
test996
test997
test998
test999