【C++和C#的區別雜談】后自增運算符的結算時機

C++和C#的前自增++n和后自增n++,都是先自增后取值和先取值后自增的含義,但在複雜一點的賦值語句中,我發現細節上有很大的差異。

發現這個問題主要是一個無聊的晚上,我想搞清楚后自增是什麼時候結算,自己搗鼓了一下之後我把我自己的測試結果告訴了朋友,結果學java的朋友和我爭論了半天,最後發現同樣的代碼,大家輸出是不一樣的。之後我又用了C#寫了同樣的測試代碼,發現輸出和他java是一樣的,這讓我豁然開朗,遂寫下這篇博客希望分享我的結論,如果有錯誤的話,歡迎評論區指正。

前排提醒:C++和C#我都是用的VS2017,不同編譯環境的C++代碼輸出結果可能不一樣

先說我的結論:

C++:i++遇到順序點(逗號,分號)之後i才自增,即我一直以來認為的一條語句結束后結算。但++i前自增的值會影響賦值語句所有i的值。

C#:C#不允許使用‘,’逗號運算符,但也並非到’;’分號才結算,賦值語句是從左到右,按序取值,i++在取完i的值之後馬上就自增了,但不影響之前取的i的值,隻影響後續i的取值。

心得:實際開發還是盡量自增單行寫,第一個是可讀性好,第二個是不容易出問題。(應該也就只有筆試會出現以下實驗的代碼了)

結論看不明白的可以看看我無聊的小實驗:

最簡單常見的版本:

int arr[] = { 0,0,0 };
int n = 0;
arr[n] = n++;//語句a
for (int num : arr)
{
	cout << num << ' ';
}
//輸出是0 0 0,語句a結束后n自增到1

上面這段代碼其實在C#也是一樣的輸出,但如果下面這樣寫,結果就不一樣了。

C++版:

int arr[] = { 0,0,0 };
int n = 0;
arr[n++] = n;//語句a
for (int num : arr)
{
	cout << num << ' ';
}
//輸出是0 0 0,語句a結束后n自增到1,C++結果和上面的一樣

C#版:

int[] arr = { 0, 0, 0 };
int n = 0;
arr[n++] = n;//語句a
foreach (int num in arr)
{
	Console.Write(num + " ");
}
//輸出是1 0 0,現在應該能理解結論了,從左到右,先取n作為索引值,然後自增之後影響到了等號右邊的n的值
//語句a則為arr[0] = 1;

就是這樣的差異開始引申出了問題,也是讓我迷惑的開始,接下來我會通過更複雜的例子和反彙編的指令來解釋和證明我的結論,先列舉C++的部分,之後再C#,感興趣的可以往下看。

C++部分:

//代碼01
int arr[] = { 0,0,0 };
int n = 0;
arr[n++] = n + (n++) + ++n;
for (int num : arr)
{
	cout << num << ' ';
}
//輸出為0 3 0,具體操作流程為語句先結算了++n,使得n自增到1.而出現的兩個n++都在賦值語句結束后結算
//所以編譯結果為arr[1] = 1 + 1 + 1; 然後i自增兩次到3

以下為反彙編的結果:

一開始看到這個我有點懵逼,但是通過比對下面這段代碼的反彙編指令,就能看出來了。

//代碼02
int[] arr = { 0, 0, 0 };
int n = 0;
arr[++n] = n + (n++) + ++n;//把索引處的n++改為了++n
foreach (int num in arr)
{
	Console.Write(num + " ");
}
//輸出為0 0 6,具體操作流程為語句先結算兩次++n,使得n自增到2.而n++在賦值語句結束后結算
//所以編譯結果為arr[2] = 2 + 2 + 2; 然後i自增到3
//這下應該發現n在這條語句中取值的時候都是同樣的值了

以下為上面代碼02的反彙編結果:

通過和上面的指令比對可以看出來了,具體差異在00251F3A這段指令,arr[++n]這段代碼02在累加前多進行了一次對n的自增,然後將自增后的值賦給了n,然後開始進行累加,而上面arr[n++]那段代碼01是在累加結束之後,在01161F4A那條指令對n++進行自增的結算,所以就算看不懂全部的指令,也應該能通過比對這兩段代碼看出他們的差異,從而證明了C++對於后自增的處理,是在語句結束之後結算。

說到語句結束,我之前寫了一篇關於逗號運算符的博客,可以結合今天這個結論看看下面這段代碼的輸出結果。

int arr[] = { 0,0,0 };
int n = 0;
arr[n] = (n++, n + (n++) + ++n);//在逗號左邊添加了n++的語句
for (int num : arr)
{
	cout << num << ' ';
}
//輸出為0 0 6
//原因為逗號也屬於一條語句結束的標誌,所以結算了n++,n=1,然後執行新的語句n + (n++) + ++n
//逗號右邊的語句先結算了++n,n=2,所以最後賦值語句為arr[2] = 2 + 2 + 2; 然後n++到3

至此C++的部分結束。

接下來C#的測試結果將顛覆上面的結論,如果不用java或者C#的話,下面的內容可能沒有用(朋友java的輸出結果和我C#一樣,不過也是希望大家自己試試,我自己沒有試過)

C#部分:

//代碼01 C#版
int[] arr = { 0, 0, 0 };
int n = 0;
arr[n++] = n + (n++) + ++n;
foreach (int num in arr)
{
	Console.Write(num + " ");
}
//輸出為5 0 0 和VC++完全不一樣對吧
//具體原因為C#的賦值語句是從左到右,先取了n的值作為索引,然後馬上對n自增,n=1
//來到等號右邊,第一個n取值為1,第二個n取值為1,然後自增到2,第三個n先自增到3,然後取值為3
//所以最終編譯結果為arr[0] = 1 + 1 + 3;  即5 0 0的原因
//為了節省篇幅,我直接告訴你arr[++n] = n + (n++) + ++n的結果為0 5 0,如果你上面看懂了這個應該也懂

貼一下C#這段代碼的反彙編結果:

可以看到第一行是取n的值,然後把n作為索引值,之後inc指令對n自增1。證明了上面的結論。

即:C#的賦值語句為從左到右,按序取值,n++在取完n的值之後馬上自增,但不影響之前取的值,隻影響後續n的取值。

小結:

所以++n 先自增后取值和n++ 先取值后自增是能直接套在C#上的,而對於VC++來說,后自增的結算是非常“緩慢”的,到語句結束才結算。

感謝您的觀看。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※超省錢租車方案

※別再煩惱如何寫文案,掌握八大原則!

※回頭車貨運收費標準

※教你寫出一流的銷售文案?

奧迪開發新款純電動車 將 Tesla Model S 視為對手

Audi 近期正在開發全新、續航力達 450 公里的純電動車款,預計於 2017 年推出,Audi 技術總監 Prof. Dr. Ulrich Hackenberg 透露該系列定位為 Tesla Model S 的對手,目前仍不確定該電動車是否會加入奧迪現有車系,例如像先前曾推出過的 Audi A3 e-Tron,或是會以全新的車款來販售。   Ulrich Hackenberg 指出,這部正在開發中的純電動車,將會整合 R8 e-tron 的設計及技術,目標是要達成 450 公里的續航力。Hackenberg 進一步表示,這輛車將在 2017 年上市,但不會是跑車。   能達到 450 公里的續航力主要是拜 Audi 新一代的電動馬達及電池所賜,該系統具有更高的電力效能,Volkswagen 動力開發總監 Dr. Heinz-Jakob Neußer 即指出,該電動馬達比現今的電動車(像是 e-Golf)具有高達 5 倍的電力效能。   Hackenberg 對 Audi 未來全電動車系的細節仍不願透露,但預計會採用轎車大小的車體,因為轎車的空間較有利在車板下方放置更大且更有力的電池,如此才不會影響電池運作或減少乘客空間。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※教你寫出一流的銷售文案?

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※回頭車貨運收費標準

※別再煩惱如何寫文案,掌握八大原則!

※超省錢租車方案

日產電動車全球銷量突破 20 萬台 市占近 6 成

日產汽車 (Nissan) 26 日宣佈,雷諾日產聯盟 (Renault-Nissan Alliance) 電動車 (EV) 全球累計銷售量已正式突破 20 萬台,於全球 EV 市場的市佔率高達 58%;其中日產 EV「Leaf」銷售量約 15 萬台,包含雷諾「Twizy」等其他 4 款車種銷售量約 5 萬台。日產指出,20 萬台 EV 的行駛距離已高達約 40 億 km、足可繞地球跑 10 萬圈以上,且節省了 2 億公升燃料、減排了 4.5 億公斤 CO2。   日產指出,2014 年 1 月至 11 月初期間,雷諾日產聯盟 EV 全球銷售量較去年同期大增 20% 至 6 萬 6,500 台,其中 Leaf 於美國市場的銷售量比其他同業 EV 車款及插電式油電混合車 (PHV) 車款的合計銷售量還高,有望成為美國今年最暢銷的 EV 車款。   日產表示,今年 Leaf 美國銷售量預估將年增 35%,且其月銷售量已連 21 個月創史上新高紀錄,而 1 至 10 月的銷售量已超越 2013 年全年水準,篤定將再創新高紀錄。  

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※超省錢租車方案

※別再煩惱如何寫文案,掌握八大原則!

※回頭車貨運收費標準

※教你寫出一流的銷售文案?

油價大跌 陸新能源汽車銷售目標恐難達成

國際原油每桶已跌破 55 美元,這對大陸正在推動新能源汽車恐怕將踢到鐵板,尤其是明年銷售 50 萬輛的目標很難達陣。大陸正致力推動的新能源政策,也將出現減速的阻力,包括太陽能等替代能源產業,都在這次國際油價重跌後,面臨無以為繼的結果。   《南方周末》報導,國際油價下跌,新能源汽車首當其衝,其中以中國電動車龍頭企業比亞迪受傷最重,原本就賣不動的電動車,在油價直直落後,不少消費者根本對電動車無感。   據悉,工信部副部長蘇波除到比亞迪考察新能源汽車發展和推廣情況外,更召集相關部會舉行節能與新能源汽車產業發展部際聯席會議聯絡員會議,除了發改委、科技部、財政部等 18 個部際聯席會議成員單位,還邀請國管局、國土資源部參加,規模空前,顯見中國政府也預見新能源汽車受油價影響,政府訂定的銷售目標恐難以達陣。  

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】

※USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※台北網頁設計公司這麼多該如何選擇?

※智慧手機時代的來臨,RWD網頁設計為架站首選

※評比南投搬家公司費用收費行情懶人包大公開

※幫你省時又省力,新北清潔一流服務好口碑

※回頭車貨運收費標準

Spring Security 之 rememberMe 自動登錄

自動登錄是將用戶的登錄信息保存在用戶瀏覽器的cookie中,當用戶下次訪問時,自動實現校驗並建立登錄態的一種機制。
Spring Security提供了兩種非常好的令牌:

  • 散列算法加密用戶必要的登錄信息並生成令牌
  • 數據庫等持久性數據存儲機制用的持久化令牌

散列加密方案

在Spring Security中加入自動登錄的功能非常簡單:

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/api/user/**").hasRole("user")  //user 角色訪問/api/user/開頭的路由
                .antMatchers("/api/admin/**").hasRole("admin") //admin 角色訪問/api/admin/開頭的路由
                .antMatchers("/api/public/**").permitAll()                 //允許所有可以訪問/api/public/開頭的路由
                .and()
                .formLogin()
                .and()
                .rememberMe().userDetailsService(userDetailsService());      //記住密碼
    }


重啟服務后訪問受限 API,這次在表單登錄頁中多了一個可選框:

勾選“Remember me on this computer”可選框(簡寫為Remember-me),按照正常的流程登錄,並在開發者工具中查看瀏覽器cookie,可以看到除JSESSIONID外多了一個值:

這是Spring Security默認自動登錄的cookie字段。在不配置的情況下,過期時間是兩個星期:

Spring Security會在每次表單登錄成功之後更新此令牌,具體處理方式在源碼中:

RememberConfigurer:

持久化令牌方案

在持久化令牌方案中,最核心的是series和token兩個值,它們都是用MD5散列過的隨機字符串。不同的是,series僅在用戶使用密碼重新登錄時更新,而token會在每一個新的session中都重新生成。
解決了散列加密方案中一個令牌可以同時在多端登錄的問題。每個會話都會引發token的更
新,即每個token僅支持單實例登錄。
自動登錄不會導致series變更,而每次自動登錄都需要同時驗證series和token兩個值,當該
令牌還未使用過自動登錄就被盜取時,系統會在非法用戶驗證通過後刷新 token 值,此時在合法用戶
的瀏覽器中,該token值已經失效。當合法用戶使用自動登錄時,由於該series對應的 token 不同,系統
可以推斷該令牌可能已被盜用,從而做一些處理。例如,清理該用戶的所有自動登錄令牌,並通知該
用戶可能已被盜號等
Spring Security使用PersistentRememberMeToken來表明一個驗證實體:

public class PersistentRememberMeToken {
    private final String username;
    private final String series;
    private final String tokenValue;
    private final Date date;

    public PersistentRememberMeToken(String username, String series, String tokenValue, Date date) {
        this.username = username;
        this.series = series;
        this.tokenValue = tokenValue;
        this.date = date;
    }

    public String getUsername() {
        return this.username;
    }

    public String getSeries() {
        return this.series;
    }

    public String getTokenValue() {
        return this.tokenValue;
    }

    public Date getDate() {
        return this.date;
    }
}

需要使用持久化令牌方案,需要傳入PersistentTokenRepository的實例:

PersistentTokenRepository接口主要涉及token的增刪查改四個接口:

MyPersistentTokenRepositoryImpl使我們實現PersistentTokenRepository接口:

@Service
public class MyPersistentTokenRepositoryImpl implements PersistentTokenRepository {

    @Autowired
    private JPAPersistentTokenRepository  repository;

    @Override
    public void createNewToken(PersistentRememberMeToken persistentRememberMeToken) {
        MyPersistentToken myPersistentToken = new MyPersistentToken();
        myPersistentToken.setSeries(persistentRememberMeToken.getSeries());
        myPersistentToken.setUsername(persistentRememberMeToken.getUsername());
        myPersistentToken.setTokenValue(persistentRememberMeToken.getTokenValue());
        myPersistentToken.setUser_last(persistentRememberMeToken.getDate());
        repository.save(myPersistentToken);
    }

    @Override
    public void updateToken(String series, String tokenValue, Date lastUsed) {
        MyPersistentToken myPersistentToken = repository.findBySeries(series);
        myPersistentToken.setUser_last(lastUsed);
        myPersistentToken.setTokenValue(tokenValue);
        repository.save(myPersistentToken);
    }

    @Override
    public PersistentRememberMeToken getTokenForSeries(String series) {
        MyPersistentToken myPersistentToken = repository.findBySeries(series);
        PersistentRememberMeToken persistentRememberMeToken = new PersistentRememberMeToken(myPersistentToken.getUsername(), myPersistentToken.getSeries(), myPersistentToken.getTokenValue(), myPersistentToken.getUser_last());
        return persistentRememberMeToken;
    }

    @Override
    @Transactional
    public void removeUserTokens(String username) {
        repository.deleteByUsername(username);
    }
}
public interface JPAPersistentTokenRepository extends JpaRepository<MyPersistentToken,Long> {
    MyPersistentToken findBySeries(String series);
    void deleteByUsername(String username);
}
@Entity
@Table(name = "persistent_token")
public class MyPersistentToken {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private Long id;
    private  String username;
    @Column(unique = true)
    private  String series;
    private  String tokenValue;
    private  Date user_last;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getSeries() {
        return series;
    }

    public void setSeries(String series) {
        this.series = series;
    }

    public String getTokenValue() {
        return tokenValue;
    }

    public void setTokenValue(String tokenValue) {
        this.tokenValue = tokenValue;
    }

    public Date getUser_last() {
        return user_last;
    }

    public void setUser_last(Date user_last) {
        this.user_last = user_last;
    }
}

當自動登錄認證時,Spring Security 通過series獲取用戶名、token以及上一次自動登錄時間三個信息,通過用戶名確認該令牌的身份,通過對比 token 獲知該令牌是否有效,通過上一次自動登錄時間獲知該令牌是否已過期,並在完整校驗通過之後生成新的token。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】

※USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※台北網頁設計公司這麼多該如何選擇?

※智慧手機時代的來臨,RWD網頁設計為架站首選

※評比南投搬家公司費用收費行情懶人包大公開

※幫你省時又省力,新北清潔一流服務好口碑

※回頭車貨運收費標準

TUV萊茵移駕深圳 設電動車電池實驗室

德國萊茵TUV集團19日宣佈其位於深圳的全新電動車電池實驗室正式啟動。該實驗室新增設備涵蓋大尺寸電動車電池測試和更多認證服務,可依據 UN/ECE R100標準提供全尺寸電動汽車電池和非可擕式電池的測試服務,也可按照企業需求定製檢測方案,已獲 CNAS、DAkkS、CBTL、NRTL、CATL、CTIA 等多項國際認可和授權。   TUV萊茵的深圳電池實驗室除了提供動力電池相關測試外,還可為客戶提供歐洲、北美、日本、韓國、俄羅斯、巴西等國際市場准入服務。其先進的電池性能和安全測試設備,以及來自世界各國的資深專家團隊,可根據歐盟、美國等主要國家與地區的相關標準和要求,對原電池、鉛酸蓄電池、二次鋰離子電池、鎳鎘電池、鎳氫電池、輕型電動自行車電池等產品提供檢測認證服務,以保證電池符合安全、性能、儲存、運輸、化學及電磁相容等各項要求。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】

※USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※台北網頁設計公司這麼多該如何選擇?

※智慧手機時代的來臨,RWD網頁設計為架站首選

※評比南投搬家公司費用收費行情懶人包大公開

※幫你省時又省力,新北清潔一流服務好口碑

※回頭車貨運收費標準

.NET 5.0預覽版6發布:支持Windows ARM64設備

2020年6月25日,微軟dotnet團隊在博客宣布了第六個 .NET 5.0 的預覽版:https://devblogs.microsoft.com/dotnet/announcing-net-5-0-preview-6/,在改進性能的同時增加了一些新的功能。ASP.NET Core和 EF Core也將於今日發布了。注意:EF Core 5.0 不支持 .NET Standard 2.0 或 .NET Framework,但是EF Core 5.0是支持.NET Core 3.1。 將所有內容組合在一起的里程碑式版本離預覽版 8 中完成功能只有兩步之遙,最終的 GA 版本定於 11 月發布,2019年Build大會上宣布.NET 5時,微軟就明確說了,”未來將只有一個.NET,您將能夠使用它來定位Windows、Linux、macOS、iOS、Android、tvOS、watchOS和WebAssembly等等。 微軟在4 月份宣布預覽版 2時宣布,它已經處理了其 .NET 站點上 50% 的流量。

 

自那時以來,一系列穩定的預覽版本一直在逐步修復Issue,完善現有功能和添加新的功能,雖然通常是一個小範圍,不斷敏捷迭代,小步快跑。 今天的預覽版 6 依然如此,Microsoft 將其描述為包含”一小組新功能和性能改進”。

本次更新的主要功能是在 Windows ARM64 上支持 Windows Forms 應用程序。此前.NET 5 Preview 4,Windows ARM64 上只支持控制台和 ASP.NET Core 應用程序。 通過這項支持,開發者可以在 Surface Pro X 等 Windows ARM64 設備上構建和運行 Windows Forms 應用。微軟還透露,他們仍在努力為 Windows ARM64 設備提供 WPF支持。 同時.NET 5移除了對WinRT 的內置支持,通過外部工具鏈進行支持,這麼做的最直接的好處是簡化 .NET 運行時代碼庫(一下就刪除 6 萬行代碼),而且這麼多代碼和跨平台無關。這次版本更新的內容如下:

  • Windows 窗體改進:開發人員可以強制其應用程序是單實例的,這意味着一次啟動一個實例。
  • RyuJIT 代碼質量改進:其中大量涉及常規改進(結構處理等)、ARM64 硬件內部功能和 ARM64 生成的代碼改進,從而大大減少了 ARM64 代碼大小。
  • 單個文件應用改進:添加了在單個文件中包含本機二進制文件和任何其他內容(如圖片)的新選項,.NET 5目標是為 Windows、macOS 和 Linux 啟用將應用作為一個文件發布。這個裡程碑進一步接近了。
  • 本機託管應用程序改進:一位貢獻者提供了一種新的模型,用於在本機應用程序中的 .NET 託管模型。
  • 突破性的改變 — 刪除內置 WinRT 支持: “已經用 Windows 團隊在 .NET 5.0 中提供的C#/WinRT工具鏈取代了內置 WinRT 支持。WinRT 互操作中的此更改是一個突破性的變化,使用 WinRT 的 .NET Core 3.x 應用將需要重新編譯。我們將在即將到來的預覽版中提供有關此內容的更多信息。

開發工具支持上需要Visual Studio 16.7 預覽版才支持.NET 5, Visual Studio For Mac 也支持.NET 5, 當然Visual Studio Code 安裝最新版的C#擴展插件也支持.NET 5. Visual Studio .NET遠程調試器對Windows ARM64的支持將在Visual Studio 16.7版本中提供。Visual Studio Code .NET遠程調試器支持將在以後推出。

Richard 在博客結束時說:”我們現在已經過了這個發布周期的一半。”事實上,我們開始’關閉發布’。如果您密切關注我們的代碼倉庫,您會看到我們正開始更仔細地管理問題的里程碑。 在發布了多個.NET 5 版本之後,我可以告訴你,這是一個偉大的時間。 是時候在一組我們構建的功能上取得勝利,並把它們打磨到您樂於使用它們。 這就是我們現在在家裡遠程工作所做的。 儘管 11 月首次亮相仍有望實現,但 .NET 5 不會擁有 Microsoft 最初計劃的所有特性和功能。這是因為COVID-19大流行引起的併發症。因此,完整的包將會在 2021 年 11 月與 .NET 6 一起發布。

您可以使用以下鏈接下載新的 .NET 5.0 的第六個預覽版,適用于于Windows、macOS和Linux: 

  • Windows and macOS installers
  • Binaries
  • Docker images
  • Snap installer

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】

※USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※台北網頁設計公司這麼多該如何選擇?

※智慧手機時代的來臨,RWD網頁設計為架站首選

※評比南投搬家公司費用收費行情懶人包大公開

※幫你省時又省力,新北清潔一流服務好口碑

※回頭車貨運收費標準

新北市:電動車牌照稅再延長 3 年

新北市政府稅捐稽徵處表示,為提高民眾購置電動汽車的意願,加速建立新北市成為綠色交通城市,凡民眾購買完全以電能為動力的電動汽車並於該市完成車籍登記,免徵使用牌照稅優惠延至 107 年 1 月 5 日止。   該處說,「完全以電能為動力的車輛」享有免徵使用牌照的優惠自 101 年 1 月 5 日施行起至今已滿 3 年,原優惠至今年 1 月 5 日截止。為繼續扶植國內電動車產業發展,並鼓勵民眾使用低汙染車輛,總統於 104 年 2 月 4 日公布修正使用牌照稅法第 5 條條文,繼續授權地方政府得對完全以電能為動力的汽車使用牌照稅免稅期間再延長 3 年。   稅捐處表示,配合國際新能源車輛的發展動向,及響應行政院繼續推動使用智慧電動車政策,新北市配合使用牌照稅法第 5 條修正,延長免徵牌照稅優惠期間至 107 年 1 月 5 日止。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】

※USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※台北網頁設計公司這麼多該如何選擇?

※智慧手機時代的來臨,RWD網頁設計為架站首選

※評比南投搬家公司費用收費行情懶人包大公開

※幫你省時又省力,新北清潔一流服務好口碑

※回頭車貨運收費標準

Jmeter系列(35)- 使用 ServerAgent 監控服務器

如果你想從頭學習Jmeter,可以看看這個系列的文章哦

https://www.cnblogs.com/poloyy/category/1746599.html

 

前言

  • 做性能測試,監控服務器資源指標是必須有的一步
  • 這一篇博客將講解通過 Jmeter 插件來監控服務器,再通過 Jmeter 觀察監控結果

 

下載、安裝、運行插件

  1. JMeterPlugins-Extras.jar
  2. JMeterPlugins-Standard.jar
  3. ServerAgent-2.2.3.zip

可以通過官方下載:https://jmeter-plugins.org/downloads/old/

注意

  • 前兩個插件最新版本在官網已經不提供下載了,只能下載舊版本,官方建議通過 Plugins Manager 下載需要的插件哦
  • 博主安裝了以下插件,已經包含上面講的前兩個插件了

 

這裏也提供百度雲下載鏈接哈

鏈接:https://pan.baidu.com/s/1bAaKqGoyaTVoq5picgBGMw 

提取碼:q92i

 

客戶端(Jmeter 端)

  1. 如果通過官網下載的話,就將 JMeterPlugins-Extras.jar 和 JMeterPlugins-Standard.jar 放到  D:\apache-jmeter-5.2.1\lib\ext 
  2. 然後通過 PerfMon Metrics Collector 監聽器進行服務器性能數據显示

 

服務端(Linux)

將 ServerAgent-2.2.3.zip 放到任意目錄下,解壓

unzip  ServerAgent-2.2.3.zip 

 

進入 ServerAgent 目錄

 

我提供的 ServerAgent 裏面,兩個 start 腳本已經是可執行腳本了,直接運行即可

./startAgent.sh

 

運行成功,則會出現下圖

 

如果無法運行,則需要給腳本賦權

chmod 777 startAgent.sh

 

如果是想監控 Window 機器,則將 ServerAgent 放到 Window 電腦的目錄下,然後直接雙擊運行  startAgent.bat 即可

 

划重點

  • 啟動 ServerAgent 的前提是系統已安裝配置好 Java 環境
  • 默認佔用端口是 4444

 

啟動 ServerAgent 可能會出現的問題

端口被佔用

殺掉佔用 4444 端口的進程

  1. 先查出 4444 端口是什麼進程佔用
  2. 然後查看進程詳情,確認是否能殺掉
  3. 如果可以,則殺掉、

 

ServerAgent 通過其他端口啟動

./startAgent.sh --udp-port 0 --tcp-port 1234

 

0 代表不開啟該端口,一般我們只用 tcp 足以

 

端口未對外開放

  • 如果服務器開啟了防火牆,而且之前沒用過 4444 端口,那麼該端口很可能會被禁用
  • 為了解決防火牆和開放端口的問題,可以參考這篇博文:https://www.cnblogs.com/poloyy/p/12213297.html

 

Jmeter 監控服務器全流程

一個簡單的負載測試線程組結構樹

一般做負載測試,會監控服務器資源、活動線程數、響應時間、TPS等等,所以加了一堆監聽器

 

PerfMon Metrics Collector

IP 自然就是填需要監控的服務器 IP啦,如果是監控本機就填 127.0.0.1 就好了

 

可監控的指標列表

還挺多,不過一般重點關注前面四個就好了

 

運行結果

我的 cpu 真高…因為數據庫出現死鎖了,回頭可以好好性能分析一波了!

  本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】

※USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※台北網頁設計公司這麼多該如何選擇?

※智慧手機時代的來臨,RWD網頁設計為架站首選

※評比南投搬家公司費用收費行情懶人包大公開

※幫你省時又省力,新北清潔一流服務好口碑

※回頭車貨運收費標準

續航力有解?特斯拉將推軟體更新

特斯拉執行長馬斯克 (Elon Musk) 宣稱 19 日將發布軟體更新,車主不必再憂慮電動車續航力不足的問題。   馬斯克 15 日在推特發文宣布,車主不必再煩惱電動車里程數,特斯拉將透過軟體更新解決問題,Model S 全系列車種皆可受惠。他說,特斯拉將在美西時間 19 日上午 9 點舉辦記者會說明。   目前還不清楚特斯拉是否找出方法,加長電動車續航力;或要更新地圖,方便車主尋找附近充電站。目前 Model S 的 60 kilowatt 車款,充飽電可跑 208 英里;85kwh 車款則可跑 265 英里,續航力超過市面現行的電動車。      

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】

※USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※台北網頁設計公司這麼多該如何選擇?

※智慧手機時代的來臨,RWD網頁設計為架站首選

※評比南投搬家公司費用收費行情懶人包大公開

※幫你省時又省力,新北清潔一流服務好口碑

※回頭車貨運收費標準