There are great books on this topic like Luke Wroblewski’s “Web Form Design,” if you haven’t read that I highly suggest it. From my experience it’s all about reducing friction. Some examples of each of those. Autocompletes or inline error checking. These help provide immediate feedback so there’s less of a submit/errors loops going to and from the server. That takes time and you lose context, once you submit. Show them the error as they’re working in the field. Do later what you don’t need to do now. If you can break it down into two pages or waiting to ask those questions in registration after they’ve first logged in / activated. Do that! If all you need to register is a email address and password capture that, and put those important questions later in the flow after verification. Readability, your ability to consume and evaluate the effort of a form. I am sure there are some Jakob Nielsen or Luke W. studies how how stacked forms (label on top and input field below) are faster to consume and enter data. These are some of the things I love to focus on when building a form or optimizing a flow.
With respect to auto-complete, do you have any suggestions on auto-completing using a large list of data / maybe thousands of pre-existing items in the list. Looking for flexible auto-complete with good performance. eg. flexible = I start typing in son, I would get son, sonny, samualson, son of sam, sam and his son …..