Guest User

Untitled

a guest
Dec 14th, 2018
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.30 KB | None | 0 0
  1. extern crate rand;
  2.  
  3. use rand::prelude::*;
  4. use std::cell::RefCell;
  5. use std::collections::VecDeque;
  6.  
  7. #[derive(Debug)]
  8. struct Server {
  9. current_time: f64,
  10. total_work_time: f64,
  11. total_idle_time: f64,
  12. }
  13.  
  14. impl Server {
  15. fn new() -> Server {
  16. Server {
  17. current_time: 0.0,
  18. total_work_time: 0.0,
  19. total_idle_time: 0.0,
  20. }
  21. }
  22. }
  23.  
  24. #[derive(Clone, Copy)]
  25. struct Request {
  26. receive_time: f64,
  27. process_time: f64
  28. }
  29.  
  30. impl Request {
  31. fn new(frequency: f64, avg_process_time: f64) -> Request {
  32. Request {
  33. receive_time: (-1.0 / frequency)*(rand::thread_rng().gen::<f64>().ln()),
  34. process_time: (-avg_process_time)*(rand::thread_rng().gen::<f64>().ln())
  35. }
  36. }
  37. }
  38.  
  39. fn main() {
  40. const COUNT_OF_SERVERS: usize = 1;
  41. const MAX_BUFFER_SIZE: usize = 2;
  42.  
  43. let mut servers = Vec::<RefCell<Server>>::new();
  44. for _ in 0..COUNT_OF_SERVERS {
  45. servers.push(RefCell::<Server>::new(Server::new()));
  46. }
  47.  
  48. let mut buffer = VecDeque::<Request>::new();
  49.  
  50. let mut time_servers_vec = Vec::<f64>::new();
  51. let mut time_buffer_vec = Vec::<f64>::new();
  52.  
  53. time_servers_vec.resize(COUNT_OF_SERVERS + 1, 0.0);
  54. time_buffer_vec.resize(MAX_BUFFER_SIZE + 1, 0.0);
  55.  
  56. let mut total_time: f64 = 0.0;
  57.  
  58. while total_time <= 3600.0 {
  59. let request = Request::new(1.5, 2.0);
  60.  
  61. let mut free_servers = servers.iter().filter(|s| s.borrow().current_time <= request.receive_time).collect::<Vec<_>>();
  62. let mut busy_servers = servers.iter().filter(|s| s.borrow().current_time > 0.0).collect::<Vec<_>>();
  63. let after_receive_servers = servers.iter().filter(|s| s.borrow().current_time > request.receive_time).collect::<Vec<_>>();
  64.  
  65. let mut current_receive_time = request.receive_time;
  66. let mut last_process_time = 0.0;
  67.  
  68. let mut request_accepted = false;
  69.  
  70. while current_receive_time > 0.0 {
  71. if free_servers.len() > 0 {
  72.  
  73. free_servers.sort_by(|s1, s2| s1.borrow().current_time.partial_cmp(&s2.borrow().current_time).unwrap());
  74.  
  75. let mut is_process_complete = false;
  76.  
  77. let mut current_free_server = free_servers[0].borrow_mut();
  78.  
  79. time_buffer_vec[buffer.len()] += current_free_server.current_time - last_process_time;
  80.  
  81. if buffer.is_empty() {
  82. time_servers_vec[busy_servers.len()] += current_free_server.current_time - last_process_time;
  83. }
  84.  
  85. current_receive_time -= current_free_server.current_time - last_process_time;
  86. last_process_time = current_free_server.current_time;
  87.  
  88. if !buffer.is_empty() {
  89. current_free_server.current_time += buffer.pop_front().unwrap().process_time;
  90.  
  91. is_process_complete = current_free_server.current_time >= request.receive_time;
  92.  
  93. if is_process_complete {
  94. current_free_server.total_work_time += request.receive_time;
  95. current_free_server.current_time -= request.receive_time;
  96. }
  97. }
  98. else if !request_accepted {
  99. current_free_server.total_idle_time += request.receive_time - current_free_server.current_time;
  100. current_free_server.total_work_time += current_free_server.current_time;
  101. current_free_server.current_time = request.process_time;
  102.  
  103. request_accepted = true;
  104. is_process_complete = true;
  105.  
  106. busy_servers = busy_servers.into_iter().filter(|s| s.as_ptr() != free_servers[0].as_ptr()).collect::<Vec<_>>();
  107. }
  108. else {
  109. current_free_server.total_work_time += current_free_server.current_time;
  110. current_free_server.total_idle_time += request.receive_time - current_free_server.current_time;
  111. current_free_server.current_time = 0.0;
  112.  
  113. is_process_complete = true;
  114.  
  115. busy_servers = busy_servers.into_iter().filter(|s| s.as_ptr() != free_servers[0].as_ptr()).collect::<Vec<_>>();
  116. }
  117.  
  118. if is_process_complete {
  119. free_servers.remove(0);
  120. }
  121.  
  122. }
  123. else {
  124. time_buffer_vec[buffer.len()] += current_receive_time;
  125.  
  126. if buffer.is_empty() {
  127. time_servers_vec[busy_servers.len()] += current_receive_time;
  128. }
  129.  
  130. if buffer.len() < MAX_BUFFER_SIZE {
  131. buffer.push_back(request);
  132. }
  133.  
  134. break;
  135. }
  136. }
  137.  
  138. for server in after_receive_servers {
  139. server.borrow_mut().current_time -= request.receive_time;
  140. server.borrow_mut().total_work_time += request.receive_time;
  141. }
  142.  
  143. total_time += request.receive_time;
  144.  
  145. }
  146.  
  147. println!("The time servers payload: {:?}", time_servers_vec);
  148. println!("The time servers + buffer payload: {:?}", time_buffer_vec);
  149.  
  150.  
  151. }
Add Comment
Please, Sign In to add comment