我們來了解簡單下電腦內存條的作用。電腦的所有程序都是在內存條里運行的。內存條的性能影響CPU的工作效率。CPU再給力,內存條很孬,那么CPU就發揮不了全部功力。CPU的發展是日新月異,而電腦儲存設備則一直是電腦速度的瓶頸所在。
來說一說超頻有什么好處。當我們發現電腦在使用過程中內存的占用比例很高,且一個簡單的程序的操作占用內存的波動很大,電腦運行程序速度很慢時,我們可以選擇加一根內存條,或者簡單點、實惠點,就地超頻。適當的超頻可以提高電腦運行速度。還有當我們需要使用兩條不同頻率的內存條時,頻率高的內存條會自動向頻率低的內存條靠攏,頻率和時序都會隨之變化。這時候,我們就需要超一超,把頻率低的超頻上去。這樣就保存了內存的性能。方便我們加條。最后,對于那些極端追求電腦性能的玩家,不超不花錢,不超不快樂斯基,即使高端的新條也要超起來,超頻成為高品質電腦數碼享受的起碼要求。
所以內存條超頻還是大有可為,讓人怦然心動的。那么我們超頻之前應該注意什么,或者影響超頻的因素有那些呢?我們按照主次順序來講這個問題。
第一、影響內存條超頻的最重要因素是內存顆粒。首先是看廠家,美光顆粒的超頻性能是最好的。現在市面上玩內存超頻的條子幾乎都是用的美光廠顆粒。國內發燒級內存條廠商阿斯加特就是用的美光原廠顆粒。像芝奇、爾必達、南亞易盛、三星、英飛凌、海力士等顆粒在超頻性能上要差一些。其次,看內存,內存越大容錯越低,顆粒越大,容錯越低,但專門為超頻設計的條子都是有糾錯能力的。
第二、影響內存條超頻的還有內存條的PCB板。PCB版分為公版和非公版。公版是不適合超頻的。非公版是在公版的基礎上專為游戲、超頻改進的設計。PCB的層數也對超頻有影響PCB層數多的電氣干擾就弱,性能就越好。
第三、影響內存條超頻的還有內存條的散熱。電腦內存條的超頻主要是通過加電壓實現的。電壓增加,功率也增加了,所以散熱性能的好壞也嚴重關系到超頻的性能。
第四、主板和CPU支持內存條的頻率范圍。內存條無論是超頻與否,頻率都應該在主板和CPU規定的范圍內。一定要注意主板和CPU參數。另外,主板IMM插槽的64條銅絲走線,也影響了內存條的性能和超頻。
這四個方面決定了內存條的性能和超頻能力。所以在我們超頻或者購買內存條時一定要注意了。
(沒有護甲完全漏出的內存條是非常不安全的,除了金手指部分其他金屬部分都非常容易氧化。)
在正式開始修改SPD超頻之前,我們來了解一下什么是SPD。SPD:Serial Presence Detect 的縮寫,中文譯名為串行寄存檢測。通常每一根內存條上都有一塊EEPROM芯片(電可擦除只讀存儲器),里面記錄了最少一組SPD信息,信息包括內存顆粒的類型及模組廠商、工作頻率、工作電壓、速度、容量、電壓與行、列地址帶寬等參數,以便于電腦啟動時內存有一個最基本的參考工作標準。電腦開機時BIOS直接讀取SPD取得內存的相關資料。由于該參考值是在不同用戶的電腦中使用,為避免有些性能不佳的舊電腦無法使用這根內存,因此每根內存條的SPD值一般來說都設得比較保守,通常都不是內存的最快運行速度。為了不浪費內存條性能,也因為SPD的修改很簡單,所以我們選擇用修改SPD的方法來對內存條進行超頻。
再來,我們還需要了解一下什么是時序。內存條時序是存在SPD當中的描述內存條性能的一種參數。比如阿斯加特(Asgard)的雷赤X3,時序是16-16-16-36。4組數字分別對應的參數是“CL-tRCD-tRP-tRAS”,它們的含義依次為:CAS Latency(簡稱CL值)內存CAS延遲時間; RAS-to-CAS Delay(tRCD),內存行地址傳輸到列地址的延遲時間; RAS Precharge Delay(tRP),內存行地址選通脈沖預充電時間; Row Active Delay(tRAS),內存行地址選通延遲。玩家可以修改調節時序參數。
好了,理論知識基本已經到位。現在我們來說說如何“簡單的修改SPD超頻電腦內存條”。
下載SPDTool工具;
1.讀取SPD并保存。方便有需要再刷回來。
2.修改SPD內容。
第一處是:SDRAM Cycle time at Maximum Supported CAS Latency(內存支持的最大CAS潛伏周期),這里的值是:3.00ns(333MHz),我們改為:2.50ns(400MHz);接下來改Minimum Clock Cycle at CLX-1(最小CAS潛伏周期1)和Minimum Clock Cycle at CLX-2(最小CAS潛伏周期2),把3.75ns(267MHz)和5.00ns(200MHz)分別改為3.00ns(333MHz)和3.75ns(267MHz)。注意:你光標點到哪,下面的方框里,藍色標記處就會出現這個參數的含義或者名稱。不要擔心找不著該改哪里。
TRAS和TRC不用改。400MHz對應的時序是5-6-6-18-24(TCL-TRCD-TRP-TRAS-TRC),我們把它改為5-5-5-18-24。向下找到Minimum Row Precharge Time(tRP)和Minimum RAS to CAS delay(tRCD),把15.00ns都改為12.50ns,超頻修改完成。點擊“文件”,選擇“寫入”,往下點“是”,直到寫入完成后,重啟電腦。
SPD TOOL工具簡單方便,功能強大,但偶爾也會有些小毛病。最好下個CPU-Z在超頻前,和超頻后都測一測內存條,看看頻率改變多少,時序變化如何,以便知道超到頻沒有,還有多少超頻的余地。
另外可以不用進BIOS,就在WINDOWS下超頻的軟件還有Thaiphoon,不過沒有漢化版,功能也是相當強大和豐富的。
電腦內存條超頻其實是很簡單的。有適合的工具,再折騰一下,一般人都可以做到。但電腦內存條的選擇才是一門學問。選擇不好,性能,超頻都沒有,那是怎么也玩不轉的。所以我在前面介紹了這么多內存條的知識。希望大家在選擇內存條的時候一定要注意了。
spdlog是一個開源的、快速的、僅有頭文件的C++11 日志庫,code地址在 https://github.com/gabime/spdlog ,目前最新的發布版本為0.14.0。它提供了向流、標準輸出、文件、系統日志、調試器等目標輸出日志的能力。它支持的平臺包括Windows、Linux、Mac、Android。
spdlog特性:
(1)、非常快,性能是它的主要目標;
(2)、僅包括頭文件;
(3)、日志的格式化處理使用開源的fmt庫( https://github.com/fmtlib/fmt );
(4)、可選的printf語法支持;
(5)、非常快的異步模式(可選),支持異步寫日志;
(6)、自定義格式;
(7)、條件日志;
(8)、多線程/單線程日志;
(9)、各種日志目標:可對日志文件進行循環輸出;可每日生成日志文件;支持控制臺日志輸出(支持顏色);系統日志;Windows debugger;較容易擴展自定義日志目標;
(10)、支持日志輸出級別:閾值級別既可以在運行時也可以在編譯時修改。
以下是測試代碼,主要來自spdlog/example/example.cpp:
#include "funset.hpp" #include <iostream> #include "spdlog/spdlog.h" #include "spdlog/fmt/ostr.h" namespace spd=spdlog; int test_spdlog_console() { try { // Console logger with color auto console=spd::stdout_color_mt("console"); console->info("Welcome to spdlog!"); console->error("Some error message with arg{}..", 1); // Conditional logging example console->info_if(true, "Welcome to spdlog conditional logging!"); // Formatting examples console->warn("Easy padding in numbers like {:08d}", 12); console->critical("Support for int: {0:d}; hex: {0:x}; oct: {0:o}; bin: {0:b}", 42); console->info("Support for floats {:03.2f}", 1.23456); console->info("Positional args are {1} {0}..", "too", "supported"); console->info("{:<30}", "left aligned"); SPDLOG_DEBUG_IF(console, true, "This is a debug log"); spd::get("console")->info("loggers can be retrieved from a global registry using the spdlog::get(logger_name) function"); // Create basic file logger (not rotated) auto my_logger=spd::basic_logger_mt("basic_logger", "E:/GitCode/Messy_Test/testdata/basic_log"); my_logger->info("Some log message"); // Create a file rotating logger with 5mb size max and 3 rotated files auto rotating_logger=spd::rotating_logger_mt("some_logger_name", "E:/GitCode/Messy_Test/testdata/mylogfile_log", 1048576 * 5, 3); for (int i=0; i < 10; ++i) rotating_logger->info("{} * {} equals {:>10}", i, i, i*i); // Create a daily logger - a new file is created every day on 2:30am auto daily_logger=spd::daily_logger_mt("daily_logger", "E:/GitCode/Messy_Test/testdata/daily_log", 2, 30); // trigger flush if the log severity is error or higher daily_logger->flush_on(spd::level::err); daily_logger->info(123.44); // Customize msg format for all messages spd::set_pattern("*** [%H:%M:%S %z] [thread %t] %v ***"); rotating_logger->info("This is another message with custom format"); // Runtime log levels spd::set_level(spd::level::info); //Set global log level to info console->debug("This message shold not be displayed!"); console->set_level(spd::level::debug); // Set specific logger's log level console->debug("This message shold be displayed.."); // Compile time log levels // define SPDLOG_DEBUG_ON or SPDLOG_TRACE_ON SPDLOG_TRACE(console, "Enabled only #ifdef SPDLOG_TRACE_ON..{} ,{}", 1, 3.23); SPDLOG_DEBUG(console, "Enabled only #ifdef SPDLOG_DEBUG_ON.. {} ,{}", 1, 3.23); SPDLOG_DEBUG_IF(console, true, "This is a debug log"); // Apply a function on all registered loggers spd::apply_all([&](std::shared_ptr<spdlog::logger> l) { l->info("End of example."); }); // Release and close all loggers spdlog::drop_all(); } // Exceptions will only be thrown upon failed logger or sink construction (not during logging) catch (const spd::spdlog_ex& ex) { std::cout << "Log init failed: " << ex.what() << std::endl; return -1; } return 0; } int test_spdlog_async() { // Asynchronous logging is very fast.. // Just call spdlog::set_async_mode(q_size) and all created loggers from now on will be asynchronous.. size_t q_size=4096; //queue size must be power of 2 spdlog::set_async_mode(q_size); auto async_file=spd::daily_logger_st("async_file_logger", "E:/GitCode/Messy_Test/testdata/async_log"); for (int i=0; i < 100; ++i) async_file->info("Async message #{}", i); return 0; } int test_spdlog_syslog() { // there is no syslog.h file in windows, so macro SPDLOG_ENABLE_SYSLOG should be disenable #ifdef SPDLOG_ENABLE_SYSLOG std::string ident="spdlog-example"; auto syslog_logger=spd::syslog_logger("syslog", ident, LOG_PID); syslog_logger->warn("This is warning that will end up in syslog."); #endif return 0; } // user defined types logging by implementing operator<< struct my_type { int i; template<typename OStream> friend OStream& operator<<(OStream& os, const my_type& c) { return os << "[my_type i=" << c.i << "]"; } }; int test_spdlog_user_defined() { try { //spd::get("console")->info("user defined type: {}", my_type{ 14 }); auto console=spd::stdout_color_mt("console"); console->info("user defined type: {}", my_type{ 14 }); } catch (const spd::spdlog_ex& ex) { std::cout << "user defined log fail: " << ex.what() << std::endl; return -1; } return 0; } int test_spdlog_err_handler() { // can be set globaly or per logger(logger->set_error_handler(..)) spdlog::set_error_handler([](const std::string& msg) { std::cerr << "my err handler: " << msg << std::endl; }); //spd::get("console")->info("some invalid message to trigger an error {}{}{}{}", 3); auto console=spd::stdout_color_mt("console"); console->info("some invalid message to trigger an error {}{}{}{}", 3); return 0; }
最后,如果你想學C/C++可以私信小編“01”獲取素材資料以及開發工具和聽課權限哦!