Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Performance issues #407

Open
paescebu opened this issue Mar 8, 2024 · 0 comments
Open

Performance issues #407

paescebu opened this issue Mar 8, 2024 · 0 comments
Labels
bug Something isn't working

Comments

@paescebu
Copy link
Contributor

paescebu commented Mar 8, 2024

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?

@paescebu paescebu added the bug Something isn't working label Mar 8, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

1 participant