The GetUploadStream method, unlike PutFile, was not optimised for speed.
When you call upload-stream's Write method, Rebex SFTP sends a single SSH_FXP_WRITE command to the server, waits for response, and only then it returns. On the other hand, PutFile initially sends multiple SSH_FXP_WRITE commands without waiting for server reply and when each reply is received, subsequent SSH_FXP_WRITE is sent, keeping the link saturated.
If you need a writable upload stream with PutFile-like speed, use BeginPutFile method with our experimental Pipe class:
            src.Position = 0;
            using (var pipe = new Rebex.IO.Pipe())
            {
                var dst = pipe.Input;
                var ar = client.BeginPutFile(pipe.Output, remoteFile, null, null);
                var buffer = new byte[0x7000];
                while (true)
                {
                    int read = src.Read(buffer, 0, buffer.Length);
                    if (read <= 0) break;
                    dst.Write(buffer, 0, read);
                }
                dst.Close();
                long n = client.EndPutFile(ar);
            }
            // [test #4, duration ... 00:00:??.??]
Please let me know whether this works!