| //===--- StringComparison.swift -------------------------------------*- swift -*-===// |
| // |
| // This source file is part of the Swift.org open source project |
| // |
| // Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors |
| // Licensed under Apache License v2.0 with Runtime Library Exception |
| // |
| // See https://swift.org/LICENSE.txt for license information |
| // See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors |
| // |
| //===----------------------------------------------------------------------===// |
| |
| % # Ignore the following warning. This _is_ the correct file to edit. |
| //////////////////////////////////////////////////////////////////////////////// |
| // WARNING: This file is manually generated from .gyb template and should not |
| // be directly modified. Instead, make changes to StringComparison.swift.gyb and run |
| // scripts/generate_harness/generate_harness.py to regenerate this file. |
| //////////////////////////////////////////////////////////////////////////////// |
| |
| // |
| // Test String iteration performance over a variety of workloads, languages, |
| // and symbols. |
| // |
| |
| import TestsUtils |
| |
| extension String { |
| func lines() -> [String] { |
| return self.split(separator: "\n").map { String($0) } |
| } |
| } |
| |
| % Names = ["ascii", "latin1", "fastPrenormal", "slowerPrenormal", "nonBMPSlowestPrenormal", "emoji", "abnormal", "zalgo"] |
| |
| public let StringComparison = [ |
| % for Name in Names: |
| BenchmarkInfo( |
| name: "StringComparison_${Name}", |
| runFunction: run_StringComparison_${Name}, |
| tags: [.validation, .api, .String]), |
| % end # Names |
| ] |
| |
| % for Name in Names: |
| @inline(never) |
| public func run_StringComparison_${Name}(_ N: Int) { |
| var count = 0 |
| let workload = Workload.${Name} |
| let tripCount = workload.tripCount |
| let payload = workload.payload |
| for _ in 1...tripCount*N { |
| for s1 in payload { |
| for s2 in payload { |
| let cmp = s1 < s2 |
| count += cmp ? 1 : 0 |
| } |
| } |
| } |
| } |
| |
| % end # Names |
| |
| struct Workload { |
| static let N = 100 |
| |
| let name: String |
| let payload: [String] |
| var scaleMultiplier: Double |
| |
| init(name: String, payload: [String], scaleMultiplier: Double = 1.0) { |
| self.name = name |
| self.payload = payload |
| self.scaleMultiplier = scaleMultiplier |
| } |
| |
| var tripCount: Int { |
| return Int(Double(Workload.N) * scaleMultiplier) |
| } |
| |
| static let ascii = Workload( |
| name: "ASCII", |
| payload: """ |
| woodshed |
| lakism |
| gastroperiodynia |
| afetal |
| Casearia |
| ramsch |
| Nickieben |
| undutifulness |
| decorticate |
| neognathic |
| mentionable |
| tetraphenol |
| pseudonymal |
| dislegitimate |
| Discoidea |
| criminative |
| disintegratory |
| executer |
| Cylindrosporium |
| complimentation |
| Ixiama |
| Araceae |
| silaginoid |
| derencephalus |
| Lamiidae |
| marrowlike |
| ninepin |
| trihemimer |
| semibarbarous |
| heresy |
| existence |
| fretless |
| Amiranha |
| handgravure |
| orthotropic |
| Susumu |
| teleutospore |
| sleazy |
| shapeliness |
| hepatotomy |
| exclusivism |
| stifler |
| cunning |
| isocyanuric |
| pseudepigraphy |
| carpetbagger |
| unglory |
| """.lines(), |
| scaleMultiplier: 0.25 |
| ) |
| |
| static let latin1 = Workload( |
| name: "Latin1", |
| payload: """ |
| café |
| résumé |
| caférésumé |
| ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º |
| 1+1=3 |
| ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹ |
| ¡¢£¤¥¦§¨©ª«¬® |
| »¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍ |
| ÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãä |
| åæçèéêëìíîïðñò |
| ÎÏÐÑÒÓÔÕÖëìíîïðñò |
| óôõö÷øùúûüýþÿ |
| 123.456£=>¥ |
| 123.456 |
| """.lines() |
| ) |
| static let fastPrenormal = Workload( |
| name: "FastPrenormal", |
| payload: """ |
| ĀāĂ㥹ĆćĈĉĊċČčĎďĐđĒēĔĕĖėĘęĚěĜĝĞğĠġĢģĤĥ |
| ĦħĨĩĪīĬĭĮįİıIJijĴĵĶķĸ |
| ĹĺĻļĽľĿŀŁłŃńŅņŇňʼnŊŋŌōŎŏŐőŒœŔŕŖŗŘřŚśŜŝŞşŠšŢţŤťŦŧŨũŪūŬŭŮůŰűŲ |
| ųŴŵŶŷŸŹźŻżŽžſƀƁƂƃƄƅƆ |
| ƇƈƉƊƋƌƍƎƏƐƑƒƓƔƕƖƗƘƙƚƛƜƝƞƟƠơƢƣƤƥƦƧƨƩƪƫƬƭƮƯưƱƲƳƴƵƶƷƸƹƺƻƼƽƾƿǀ |
| Ƈ |
| ǁǂǃDŽDždžLJLjljNJNjnjǍǎǏǐǑǒǓǔǕǖ |
| ǗǘǙǚǛǜǝǞǟǠǡǢǣǤǥǦǧǨǩǪǫǬǭǮǯǰDZDzdzǴǵǶǷǸǹǺǻǼǽǾǿȀȁȂȃȄȅȆȇȈȉȊȋȌȍȎȏȐȑ |
| ȒȓȔȕȖȗȘșȚțȜȝȞȟȠȡȢȣȤȥȦȧȨȩȪȫȬ |
| ȒȓȔȕȖȗȘșȚțȜȝȞȟȠȡȢȣȤȥȦȧȨȩȪȫȬDzdzǴǵǶǷǸǹǺǻǼǽǾǿȀȁȂȃȄȅȆȇȈȉȊȋȌȍȎȏȐȑ |
| ȭȮȯȰȱȲȳȴȵȶȷȸȹȺȻȼȽȾȿɀɁɂɃɄɅɆɇɈɉɊɋɌɍɎɏɐɑɒɓɔɕɖɗɘəɚɛɜɝɞɟɠɡɢɣɤɥɦɧɨɩɪɫɬɭɮɯɰ |
| ɱɲɳɴɵɶɷɸɹɺɻɼɽɾɿʀʁʂʃʄ |
| ɱɲɳɴɵɶɷɸɹɺɻɼɽɾɿʀʁʂʃ |
| ʅʆʇʈʉʊʋʌʍʎʏʐʑʒʓʔʕʖʗʘʙʚʛʜʝʞʟʠʡʢʣʤʥʦʧʨʩʪʫʬʭʮʯʰ |
| ʱʲʳʴʵʶʷʸʹʺʻʼʽʾʿˀˁ˂˃˄˅ˆˇˈˉˊˋˌˍˎˏːˑ˒˓˔˕˖˗˘˙˚˛˜˝˞˟ˠˡˢˣˤ˥˦ |
| ˧˨˩˪˫ˬ˭ˮ˯˰˱˲˳˴˵˶˷˸˹˺˻˼˽˾ |
| """.lines() |
| ) |
| static let slowerPrenormal = Workload( |
| name: "SlowerPrenormal", |
| payload: """ |
| Swiftに大幅な改良が施され、 |
| 安定していてしかも |
| 直感的に使うことができる |
| 向けプログラミング言語になりました。 |
| 이번 업데이트에서는 강력하면서도 |
| \u{201c}Hello\u{2010}world\u{2026}\u{201d} |
| 平台的编程语言 |
| 功能强大且直观易用 |
| 而本次更新对其进行了全面优化 |
| в чащах юга жил-был цитрус |
| \u{300c}\u{300e}今日は\u{3001}世界\u{3002}\u{300f}\u{300d} |
| но фальшивый экземпляр |
| """.lines() |
| ) |
| // static let slowestPrenormal = """ |
| // """.lines() |
| static let nonBMPSlowestPrenormal = Workload( |
| name: "NonBMPSlowestPrenormal", |
| payload: """ |
| 𓀀𓀤𓁓𓁲𓃔𓃗 |
| 𓀀𓀁𓀂𓀃𓀄𓀇𓀈𓀉𓀊𓀋𓀌𓀍𓀎𓀏𓀓𓀔𓀕𓀖𓀗𓀘𓀙𓀚𓀛𓀜𓀞𓀟𓀠𓀡𓀢𓀣 |
| 𓀤𓀥𓀦𓀧𓀨𓀩𓀪𓀫𓀬𓀭 |
| 𓁡𓁢𓁣𓁤𓁥𓁦𓁧𓁨𓁩𓁫𓁬𓁭𓁮𓁯𓁰𓁱𓁲𓁳𓁴𓁵𓁶𓁷𓁸 |
| 𓁹𓁺𓁓𓁔𓁕𓁻𓁼𓁽𓁾𓁿 |
| 𓀀𓀁𓀂𓀃𓀄𓃒𓃓𓃔𓃕𓃻𓃼𓃽𓃾𓃿𓄀𓄁𓄂𓄃𓄄𓄅𓄆𓄇𓄈𓄉𓄊𓄋𓄌𓄍𓄎 |
| 𓂿𓃀𓃁𓃂𓃃𓃄𓃅 |
| 𓃘𓃙𓃚𓃛𓃠𓃡𓃢𓃣𓃦𓃧𓃨𓃩𓃬𓃭𓃮𓃯𓃰𓃲𓃳𓃴𓃵𓃶𓃷𓃸 |
| 𓃘𓃙𓃚𓃛𓃠𓃡𓃢𓃣𓃦𓃧𓃨𓃩𓃬𓃭𓃮𓃯𓃰𓃲𓃳𓃴𓃵𓃶𓃷 |
| 𓀀𓀁𓀂𓀃𓀄𓆇𓆈𓆉𓆊𓆋𓆌𓆍𓆎𓆏𓆐𓆑𓆒𓆓𓆔𓆗𓆘𓆙𓆚𓆛𓆝𓆞𓆟𓆠𓆡𓆢𓆣𓆤 |
| 𓆥𓆦𓆧𓆨𓆩𓆪𓆫𓆬𓆭𓆮𓆯𓆰𓆱𓆲𓆳𓆴𓆵𓆶𓆷𓆸𓆹𓆺𓆻 |
| """.lines() |
| ) |
| static let emoji = Workload( |
| name: "Emoji", |
| payload: """ |
| 👍👩👩👧👧👨👨👦👦🇺🇸🇨🇦🇲🇽👍🏻👍🏼👍🏽👍🏾👍🏿 |
| 👍👩👩👧👧👨👨👦👦🇺🇸🇨🇦🇲🇽👍🏿👍🏻👍🏼👍🏽👍🏾 |
| 😀🧀😀😃😄😁🤣😂😅😆 |
| 😺🎃🤖👾😸😹😻😼😾😿🙀😽🙌🙏🤝👍✌🏽 |
| ☺️😊😇🙂😍😌😉🙃😘😗😙😚😛😝😜 |
| 😋🤑🤗🤓😎😒😏🤠🤡😞😔😟😕😖😣☹️🙁😫😩😤😠😑😐😶😡😯 |
| 😦😧😮😱😳😵😲😨😰😢😥 |
| 😪😓😭🤤😴🙄🤔🤥🤧🤢🤐😬😷🤒🤕😈💩👺👹👿👻💀☠️👽 |
| """.lines() |
| ) |
| |
| static let abnormal = Workload( |
| name: "Abnormal", |
| payload: """ |
| ae\u{301}ae\u{301}ae\u{302}ae\u{303}ae\u{304}ae\u{305}ae\u{306}ae\u{307} |
| ae\u{301}ae\u{301}ae\u{301}ae\u{301}ae\u{301}ae\u{301}ae\u{301}ae\u{300} |
| \u{f900}\u{f901}\u{f902}\u{f903}\u{f904}\u{f905}\u{f906}\u{f907}\u{f908}\u{f909}\u{f90a} |
| \u{f90b}\u{f90c}\u{f90d}\u{f90e}\u{f90f}\u{f910}\u{f911}\u{f912}\u{f913}\u{f914}\u{f915}\u{f916}\u{f917}\u{f918}\u{f919} |
| \u{f900}\u{f91a}\u{f91b}\u{f91c}\u{f91d}\u{f91e}\u{f91f}\u{f920}\u{f921}\u{f922} |
| """.lines() |
| ) |
| // static let pathological = """ |
| // """.lines() |
| static let zalgo = Workload( |
| name: "Zalgo", |
| payload: """ |
| ṭ̴̵̶̷̸̢̧̨̡̛̤̥̦̩̪̫̬̭̮̯̰̖̗̘̙̜̝̞̟̠̱̲̳̹̺̻̼͇͈͉͍͎̀́̂̃̄̅̆̇̈̉ͣͤ̊̋̌̍̎̏̐̑̒̓̔̽̾̿̀́͂̓̈́͆͊͋͌̕̚͜͟͢͝͞͠͡ͅ͏͓͔͕͖͙͚͐͑͒͗͛ͣͤͥͦͧͨͩͪͫͬͭͮ͘͜͟͢͝͞͠͡ |
| h̀́̂̃ |
| è͇͈͉͍͎́̂̃̄̅̆̇̈̉͊͋͌͏̡̢̧̨̛͓͔͕͖͙͚̖̗̘̙̜̝̞̟̠̣̤̥̦̩̪̫̬̭͇͈͉͍͎͐͑͒͗͛̊̋̌̍̎̏̐̑̒̓̔̀́͂̓̈́͆͊͋͌͘̕̚͜͟͝͞͠ͅ͏͓͔͕͖͐͑͒ |
| q̴̵̶̷̸̡̢̧̨̛̖̗̘̙̜̝̞̟̠̣̤̥̦̩̪̫̬̭̮̯̰̱̲̳̹̺̻̼͇̀́̂̃̄̅̆̇̈̉̊̋̌̍̎̏̐̑̒̓̔̽̾̿̀́͂̓̈́͆̕̚ͅ |
| ư̴̵̶̷̸̗̘̙̜̹̺̻̼͇͈͉͍͎̽̾̿̀́͂̓̈́͆͊͋͌̚ͅ͏͓͔͕͖͙͚͐͑͒͗͛ͣͤͥͦͧͨͩͪͫͬͭͮ͘͜͟͢͝͞͠͡ |
| ì̡̢̧̨̝̞̟̠̣̤̥̦̩̪̫̬̭̮̯̰̹̺̻̼͇͈͉͍͎́̂̃̄̉̊̋̌̍̎̏̐̑̒̓̽̾̿̀́͂̓̈́͆͊͋͌ͅ͏͓͔͕͖͙͐͑͒͗ͬͭͮ͘ |
| c̴̵̶̷̸̡̢̧̨̛̖̗̘̙̜̝̞̟̠̣̤̥̦̩̪̫̬̭̮̯̰̱̲̳̹̺̻̼̀́̂̃̄̔̽̾̿̀́͂̓̈́͆ͣͤͥͦͧͨͩͪͫͬͭͮ̕̚͢͡ͅ |
| k̴̵̶̷̸̡̢̧̨̛̖̗̘̙̜̝̞̟̠̣̤̥̦̩̪̫̬̭̮̯̰̱̲̳̹̺̻̼͇͈͉͍͎̀́̂̃̄̅̆̇̈̉̊̋̌̍̎̏̐̑̒̓̔̽̾̿̀́͂̓̈́͆͊͋͌̕̚ͅ͏͓͔͕͖͙͚͐͑͒͗͛ͣͤͥͦͧͨͩͪͫͬͭͮ͘͜͟͢͝͞͠͡ |
| b̴̵̶̷̸̡̢̛̗̘̙̜̝̞̟̠̹̺̻̼͇͈͉͍͎̽̾̿̀́͂̓̈́͆͊͋͌̚ͅ͏͓͔͕͖͙͚͐͑͒͗͛ͣͤͥͦͧͨͩͪͫͬͭͮ͘͜͟͢͝͞͠͡ |
| ŗ̴̵̶̷̸̨̛̩̪̫̯̰̱̲̳̹̺̻̼̬̭̮͇̗̘̙̜̝̞̟̤̥̦͉͍͎̽̾̿̀́͂̓̈́͆͊͋͌̚ͅ͏̡̢͓͔͕͖͙͚̠̣͐͑͒͗͛ͣͤͥͦͧͨͩͪͫͬͭͮ͘͜͟͢͝͞͠͡ |
| o |
| w̗̘͇͈͉͍͎̓̈́͆͊͋͌ͅ͏̛͓͔͕͖͙͚̙̜̹̺̻̼͐͑͒͗͛ͣͤͥͦ̽̾̿̀́͂ͧͨͩͪͫͬͭͮ͘̚͜͟͢͝͞͠͡ |
| n͇͈͉͍͎͊͋͌ͧͨͩͪͫͬͭͮ͏̛͓͔͕͖͙͚̗̘̙̜̹̺̻̼͐͑͒͗͛ͣͤͥͦ̽̾̿̀́͂̓̈́͆ͧͨͩͪͫͬͭͮ͘̚͜͟͢͝͞͠͡ͅ |
| f̛̗̘̙̜̹̺̻̼͇͈͉͍͎̽̾̿̀́͂̓̈́͆͊͋͌̚ͅ͏͓͔͕͖͙͚͐͑͒͗͛ͣͤͥͦ͘͜͟͢͝͞͠͡ |
| ơ̗̘̙̜̹̺̻̼͇͈͉͍͎̽̾̿̀́͂̓̈́͆͊͋͌̚ͅ͏͓͔͕͖͙͚͐͑͒͗͛ͥͦͧͨͩͪͫͬͭͮ͘ |
| xͣͤͥͦͧͨͩͪͫͬͭͮ |
| """.lines(), |
| scaleMultiplier: 0.25 |
| ) |
| |
| } |