Step 1
Set up a performance test that the move assignment operator performs.
Configure another performance test that the copy assignment statement performs.
Step 2
Configure the assignment operator in both directions as indicated in the problem instruction.
Step 3
Iterate through steps 1 and 2 until you are sure you did them right.
Step 3 should help tell you what is going on, most likely telling you where performance is changing and where it is not changing.
Guessing is not an option for steps 1-3. You really have to fulfill them. Otherwise, you (correctly) are not sure that your guesses are correct.
Step 4
Now you can start to guess. Some people will call this "hypothesis formation." A fancy way of saying guess. But at least now it is guessed.
I went through this exercise to answer this question, and did not notice a significant difference in performance for one test and the difference in performance 6X on the other. This led me to a hypothesis. After completing this work, if you are unsure of your hypothesis, update your question using your code, results, and subsequent questions.
Explanation
There are two special member assignment operators that usually have signatures:
HasPtr& operator=(const HasPtr& rhs);
You can implement both redirection assignment and copy assignment using a single assignment operator with the so-called copy / swap idiom:
HasPtr& operator=(HasPtr rhs);
This single assignment statement cannot be overloaded with the first set.
Is it better to implement two assignment operators (copy and move) or only one using the copy / swap icon? This is what Exercise 13.53 sets. To answer, you should try both methods and measure both the purpose of the copy and move the purpose. And smart, well-meaning people make mistakes, guessing, instead of testing / measuring. You have chosen a good exercise to learn.