Skip to content

Performance issues #407

Open
Open
@paescebu

Description

@paescebu

Description

Hey @davdroman !
I have some report on CustomKeyboardKit that there are some performance implications on my library if used with an extensive amount of TextFields. (See: paescebu/CustomKeyboardKit#19)
After some digging I realized that this comes probably from the overhead that is necessary to make introspection even possible. So I doubt that this can be really improved but I'm giving it a shot to ask if there are some ideas laying around.

In short, the performance on this..

import SwiftUI
import SwiftUIIntrospect
import UIKit


struct ContentView: View {
  @State private var showSheet = false
  
  var body: some View {
    VStack {
      Button("Show Keyboard Sheet") {
        showSheet.toggle()
      }
      .sheet(isPresented: $showSheet) {
          KeyboardView()
      }
    }
  }
}

struct KeyboardView: View {
    @State private var strings = [
        "1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
        "11", "12", "13", "14", "15", "16", "17", "18", "19", "20",
        "21", "22", "23", "24", "25", "26", "27", "28", "29", "30",
        "31", "32", "33", "34", "35", "36", "37", "38", "39", "40",
        "41", "42", "43", "44", "45", "46", "47", "48", "49", "50",
        "51", "52", "53", "54", "55", "56", "57", "58", "59", "60",
        "61", "62", "63", "64", "65", "66", "67", "68", "69", "70",
        "71", "72", "73", "74", "75", "76", "77", "78", "79", "80",
        "81", "82", "83", "84", "85", "86", "87", "88", "89", "90",
        "91", "92", "93", "94", "95", "96", "97", "98", "99", "100",
        "101", "102", "103", "104", "105", "106", "107", "108", "109", "110",
        "111", "112", "113", "114", "115", "116", "117", "118", "119", "120",
        "121", "122", "123", "124", "125", "126", "127", "128", "129", "130",
        "131", "132", "133", "134", "135", "136", "137", "138", "139", "140",
        "141", "142", "143", "144", "145", "146", "147", "148", "149", "150",
        "151", "152", "153", "154", "155", "156", "157", "158", "159", "160",
        "161", "162", "163", "164", "165", "166", "167", "168", "169", "170",
        "171", "172", "173", "174", "175", "176", "177", "178", "179", "180",
        "181", "182", "183", "184", "185", "186", "187", "188", "189", "190",
        "191", "192", "193", "194", "195", "196", "197", "198", "199", "200"
    ]
  
  var body: some View {
    ScrollView {
      ForEach($strings, id: \.self) { $val in
        TextField("", text: $val)
          .introspect(.textField, on: .iOS(.v17)) { textField in
              //do nothing
          }
          .padding()
          .background {
            RoundedRectangle(cornerRadius: 8)
              .fill(.gray)
          }
      }
    }
    .contentMargins(.all, 16)
  }
}

...is much worse than this:

import SwiftUI
import SwiftUIIntrospect
import UIKit


struct ContentView: View {
  @State private var showSheet = false
  
  var body: some View {
    VStack {
      Button("Show Keyboard Sheet") {
        showSheet.toggle()
      }
      .sheet(isPresented: $showSheet) {
          KeyboardView()
      }
    }
  }
}

struct KeyboardView: View {
    @State private var strings = [
        "1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
        "11", "12", "13", "14", "15", "16", "17", "18", "19", "20",
        "21", "22", "23", "24", "25", "26", "27", "28", "29", "30",
        "31", "32", "33", "34", "35", "36", "37", "38", "39", "40",
        "41", "42", "43", "44", "45", "46", "47", "48", "49", "50",
        "51", "52", "53", "54", "55", "56", "57", "58", "59", "60",
        "61", "62", "63", "64", "65", "66", "67", "68", "69", "70",
        "71", "72", "73", "74", "75", "76", "77", "78", "79", "80",
        "81", "82", "83", "84", "85", "86", "87", "88", "89", "90",
        "91", "92", "93", "94", "95", "96", "97", "98", "99", "100",
        "101", "102", "103", "104", "105", "106", "107", "108", "109", "110",
        "111", "112", "113", "114", "115", "116", "117", "118", "119", "120",
        "121", "122", "123", "124", "125", "126", "127", "128", "129", "130",
        "131", "132", "133", "134", "135", "136", "137", "138", "139", "140",
        "141", "142", "143", "144", "145", "146", "147", "148", "149", "150",
        "151", "152", "153", "154", "155", "156", "157", "158", "159", "160",
        "161", "162", "163", "164", "165", "166", "167", "168", "169", "170",
        "171", "172", "173", "174", "175", "176", "177", "178", "179", "180",
        "181", "182", "183", "184", "185", "186", "187", "188", "189", "190",
        "191", "192", "193", "194", "195", "196", "197", "198", "199", "200"
    ]
  
  var body: some View {
    ScrollView {
      ForEach($strings, id: \.self) { $val in
        TextField("", text: $val)
          .padding()
          .background {
            RoundedRectangle(cornerRadius: 8)
              .fill(.gray)
          }
      }
    }
    .contentMargins(.all, 16)
  }
}

Or do you have any idea how this can be worked around without using the introspection capability?

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions