User:MadScientistX11/ConcurrentComputingAdvantages

Advantages
The most obvious advantages of concurrent computing are better performance and more robust (fault tolerant) systems. The degree to which these advantages can be achieved is in part dependent on the type of problem. Certain problems are highly amenable to distributed solutions and those problems will show more significant gains in performance and reliability on distributed architectures.

Better Performance
The ideal performance improvement for concurrent computing is a division by the number of concurrent processors. In the idealized system if a problem can be solved in T time on one processor, distributing over N processors can reduce the time to T/N. However, in reality this idealized reduction can never be achieved. There is always an additional factor, the time required to divide the problem into sub-problems and to then combine the various sub-solutions into one complete solution. For example, when searching a list one can divide the list into N sublists and then search each sublist. However, dividing the list into sublists takes time as does comparing the various sub-solutions to choose the best match for the search. Thus, in reality the best that can ever be achieved by concurrent computing is to solve a problem requiring time T in the non-concurrent version by (T + C)/N where C is the cost in time to divide the problem and combine the solutions.

Improved Reliability
A distributed architecture can increase the fault tolerance of a system. Dividing a system into distributed sub-systems reduces the likelihood of a single point of failure. This is especially true when deploying a distributed system on distributed architectures using technologies such as application servers and message oriented middleware. With a distributed architecture, a failure of one processor ideally results in only a degradation of performance. A well designed distributed architecture will include error handling routines that can deal with system faults and simply re-route the work from the failed processor to a new one.

Disadvantages
Concurrent systems are more complex to design and implement. Dividing a problem into sub-problems and recombining the partial solutions into a complete solution by definition will require additional program logic. How much more logic depends on the type of problem and the deployment platform. Many of the most well known sorting and searching algorithms for example are designed to take advantage of concurrent solutions.

Concurrent systems can especially be more difficult to debug. With a concurrent system there are a whole new range of potential errors caused not only by faults in the program logic but in dependencies between the timing of the various concurrent processes. These types of errors can be especially hard to diagnose because they may be difficult to reproduce. An error may be caused by things that are hard to predict or comprehend such as the load on the network or the various servers.